Android Activity가 현재 실행되고 있는지 체크하는 방법

조회수 16697회

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

List proInfos = activityManager.getRunningAppProcesses();

for (int i = 0; i < proInfos.size(); i++) { if (proInfos.get(i).processName.equals(pakageName)) { Log.d(TAG, "Running : " + proInfos.get(i).processName); }

}

와 같은 방법을 찾긴했는데 process check하는 방법인 것 같아서 앱에 서비스가 작동하고 있어서 그런지 Activity를 종료해도 로그가 찍히네요.

Activity를 시작하고 종료할때 static변수 값을 true/false로 바꿔서 그 변수로 check하는 방법도 찾긴했는데 무엇이 좋은지 모르겠습니다. (Activity가 여러개라서모든 Activity에 대해서 check하는 것도 좀 그렇고...)

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • Activity가 실행 중(=Foreground 상태)인 것을 확인하고 싶다면 텔레그램의 ForegroundDetector 클래스를 참고해보세요. 원리는 Application.ActivityLifecycleCallbacks을 이용해서 Activity의 onStart() / onStop()이 호출 될 때 레퍼런스 카운트로 Activity가 Foreground인지 Background인지를 알아내는 방식입니다. (참고로 Activity가 여러개 존재해도 동작합니다.)

    https://github.com/DrKLO/Telegram/blob/a7513b3ba1923113840e78799c4c4132cc7f3116/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundDetector.java

    가령 GPS 이벤트를 1초마다 주기적으로 받는 앱이 있다고 예를 들어봅시다. 배터리 소모를 방지하기 위해 앱이 Background로 내려갔을 때는 GPS 이벤트를 수신을 중단하고, 다시 Foreground로 올라왔을 때 이벤트를 수신하고 싶다면 FogregroundDectector로 쉽게 해결할 수 있습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 위에 작성하신 코드는 현재 Process가 활성화 되어 있는지를 확인할 수 있는 코드입니다.

    그렇기에 앱이 홈으로 간다고해서 Process가 죽은것은 아닙니다.

    Activity가 내려갔는지 확인하시려면 다음을 추가해주시면 좋을것 같습니다.

    processName이 아닌 topActivity 여부 확인하시면 될것 같습니다.

    RunningTaskInfo running = info.get(0);        
    ComponentName componentName = running.topActivity;
    return cls.getName().equals(componentName.getClassName());
    

    참고자료

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)