2014-10-19 2 views
2

에있는 경우 어떻게 탐지합니까? 내 앱의 동작은 전경에 있는지 여부에 달려 있습니다. 내 앱이 포 그라운드에있는 경우 감지하는 API (21)에 가장 좋은 방법 일 것입니다 무슨,()는 지원되지 않습니다 및 API (21) 다르게 행동한다GCM 메시지를받을 때 안드로이드 앱이 포 그라운드 (API 21)

이제
Boolean onForeground = this.getPackageName().equalsIgnoreCase(
      ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE)) 
      .getRunningTasks(1).get(0).topActivity.getPackageName() 
); 

getRunningTasks : API 21 이전 나는 다음을 사용?

구글은

public ActivityManager.RecentTaskInfo getTaskInfo() 

을 권장하지만 난 내가 거기에서 필요한 정보를 얻을 수있는 방법을 볼 수 없습니다.

미리 감사드립니다.


편집 : @CommonsWare와 @ 크리스 스트래튼 제안한, 나는 onResume/onPause 상태를 추적 할 수 있습니다. WebView (내 제어 외부의 콘텐츠)에 의한 앱 충돌로 인해 시스템이 잘못된 상태로 남습니다. 잘못된 상태로 GCM을 보내면 다른 충돌이 사용자를 혼란스럽게 할 수 있습니다 (그/그녀는 그 순간 내 앱으로 아무 것도하지 않습니다).

따라서 다른 해결책을 찾고 있습니다.

+0

앱의 UI 층이 GCM 메시지가 수신되었음을 알려 이벤트 버스를 사용하여 감지합니다. 앱의 UI 레이어 (액티비티/프래그먼트)를 등록하고 포 그라운드에서오고 갈 때 버스에서 등록을 취소합니다. UI 레이어가 이벤트를 처리하지 않았는지 확인하고 백그라운드 처리 (예 : '알림'발생) 방법이 있습니다. – CommonsWare

+0

세 개의 이벤트 버스에 대해이 패턴을 구현 한 샘플이 있습니다. ['LocalBroadcastManager'] (https://github.com/commonsguy/cw-omnibus/tree/master/EventBus/LocalBroadcastManager), Square의 [Otto] (https : // github.com/commonsguy/cw-omnibus/tree/master/EventBus/Otto) 및 greenrobot의 [EventBus] (https://github.com/commonsguy/cw-omnibus/tree/master/EventBus/GreenRobot)를 참조하십시오. – CommonsWare

+0

즉, 액티비티는 onResume()과 onPause() 사이에서 포어 그라운드에 있으며 애플리케이션은 액티비티 중 하나 *가 공통된 컴포넌트로 모든 호출 또는 메시징을 통해 추적 할 수있는 경우입니다. –

답변

6

당신은 사용할 수 있습니다 (I이 사소한 것 때문에 구현, 조각을 사용하여 단 한 활동을하고있다)는 당신이

  • BroadcastReceiver가 배경 동작을 수행하는 매니페스트에 등록 만들기 ordered broadcast approach
  • 긍정적 인 우선 순위 (기본값은 0)로 BroadcastReceiver을 동적으로 등록하고 onStart()/onResume()에 등록하고 onStop()/onPause()의 등록을 취소하십시오. 이는 전경 역할을합니다 avior 및 BroadcastReceiver 등록 매니페스트을 보장하기 위해 abortBroadcast()를 호출해야는
  • 를 호출되지 않습니다

후 수신됩니다 (바람직하게는 사용자 지정 작업을 모두 다른 BroadcastReceiver의 레지스터) 브로드 캐스트를 보낼 수 sendOrderedBroadcast()을 사용할 수 있습니다 귀하의 GCM 수신기 존재하는 경우 동적 등록 된 수신기에 의해 그리고 매니페스트 등록 된 수신기가 존재하지 않는 경우에 의해 등록된다.

+0

좋아,이 정확히 내가 무엇을 찾고 있습니다. sendOrderedBroadcast()에 대해 알지도 못 했으므로 내일 읽을 책자가 있습니다. 감사. –

2

나는 getRunningAppProcesses

boolean isOnForeground = true; 
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) 
{ 
    List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses(); 
    for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) 
    { 
     if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
     { 
      for (String activeProcess : processInfo.pkgList) 
      {         if(activeProcess.equals(context.getPackageName())) 
       { 
        isOnForeground = false; 
       } 
      } 
     } 
    } 
} 
else 
{ 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
    ComponentName componentInfo = taskInfo.get(0).topActivity; 
       if(componentInfo.getPackageName().equals(context.getPackageName())) 
    { 
      isOnForeground = false; 
    } 
} 
+1

응용 프로그램 프로세스는 포 그라운드가 아닌 경우에도 포 그라운드 우선 순위/중요성을 가질 수 있습니다. OP는 자신의 응용 프로그램이 실제로 포 그라운드에 있는지 알기를 원하므로 작동하지 않습니다. 예 : startForeground를 사용하는 서비스를 가진 보이는 Activity가없는 프로세스는 전경이 중요합니다. 또한, 당신이 원하는 것의 반대편을 돌려 보내지 않습니까? – vman

관련 문제