2012-05-27 4 views
6

내 BroadcastReceivers가 C2DM 이벤트를 로컬 서비스에 전파합니다. 서비스는 ID를 내 웹 서버 pus에 보내서 등록을 완료합니다. 새 메시지에 대해 장치에 알리는 책임이 있습니다. 그러나 응용 프로그램 (활동 중 하나)이 작동하면 새 데이터로 해당 활동에 의도를 보내려고합니다. NotificationManager를 사용하여 사용자에게 알리는 것이 아니라면 업데이트 할 수 있습니다.Android 활동이 실행 중인지 확인

문제는 활동이 실행 중임을 어떻게 알 수 있습니까? Application 개체는 분명히 존재할 응용 프로그램의 일부이므로 옵션이 아닙니다. 각 애플리케이션의 onDesroy에서 등록 취소는 오리엔테이션 변경에서 발생할 수 있기 때문에 옵션이 아닙니다 ...

표준 방법으로 완료 할 수 있습니까?

답변

17

해결 방법 1 : 당신은 확인을 위해 ActivityManager을 사용할 수 있습니다 활동 실행하거나하지 않은 경우 : 매니페스트에 권한을 추가하는

public boolean isActivityRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isActivityFound = false; 
    for (int i = 0; i < activitys.size(); i++) { 
     if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) { 
      isActivityFound = true; 
     } 
    } 
    return isActivityFound; 
} 

필요 ..

<uses-permission android:name="android.permission.GET_TASKS"/> 

솔루션 2 : 귀하의 활동에서 귀하가 그것이 실행 중인지 확인하고 그것을 저장하고자하는 정적 변수를 사용할 수 있습니다 같은 서비스에서 액세스 또는 방송 수신기에 대한 몇 가지 여기서 나는 희망

static boolean CurrentlyRunning= false; 
     public void onStart() { 
     CurrentlyRunning= true; //Store status of Activity somewhere like in shared //preference 
     } 
     public void onStop() { 
     CurrentlyRunning= false;//Store status of Activity somewhere like in shared //preference 
     } 

이 도움이되었다!

+0

첫 번째 방법은 intresting처럼 보입니다.하지만 내 응용 프로그램이 실행 중인지 (서비스 제외) 정적 메서드가 좋지 않은지 알고 싶습니다. Activity에 하나 이상의 인스턴스가있을 수 있습니다. 응용 프로그램 뮤텍스가있을 수 있습니다. 트릭을 ... – codeScriber

+0

내가 틀릴 수도 있지만 이것은 단지 작업의 현재 최고 활동을 확인하는 것 같아요. 그렇다면 동일한 작업에서 다른 활동 (일시 중지 또는 중단됨)은 어떻게됩니까? –

+7

첫 번째 방법을 사용하지 마십시오. ActivityManager 설명서에서 "참고 :이 메서드는 작업 관리 사용자 인터페이스를 디버깅하고 표시하기위한 용도로만 사용되며 응용 프로그램의 핵심 논리 (예 : 여기에있는 정보를 기반로 다른 동작을 결정하는 데 사용하지 마십시오.)" – yarian

-1

here에서 복사됩니다.

활동 내에서 정적 변수를 사용할 수 있습니다.

class MyActivity extends Activity { 
    static boolean active = false; 

     public void onStart() { 
     active = true; 
     } 

     public void onStop() { 
     active = false; 
     } 
} 
+0

다른 질문과 답변에서 완벽한 일치를 찾으십시오. 여기에 대답해서는 안되지만이 질문을 중복으로 표시하십시오. –

4

당신이 (모든 실행중인 경우) 활동에 의해 수신 Google 클라우드 메시지 (C2DM)을 처리하거나 어떤 활동이 실행되지 않는 경우 통지를 발행하려는 경우 다음 방법은 잘 작동합니다.

매니페스트 파일에 BroadcastReceiver를 하나 등록하십시오. 이 수신기는 응용 프로그램이 실행 중이 지 않을 때마다 C2D 메시지를 처리합니다. 프로그래밍 방식으로 다른 BroadcastReceiver를 귀하의 활동에 등록하십시오. 이 수신자는 활동이 실행 중일 때마다 C2D 메시지를 처리합니다.

AndoroidManifest.xml

<receiver 
    android:name=".StaticReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="com.mypackage" /> 
    </intent-filter> 
</receiver> 

MyReceiver.java

public class StaticReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Trigger a Notification 
    } 
} 

MyActivity.java

public class MyActivity extends ActionBarActivity { 

    @Override 
    protected void onResume() { 
    super.onResume(); 

     final IntentFilter filter = new 
       IntentFilter("com.google.android.c2dm.intent.RECEIVE"); 
     filter.addCategory("com.mypackage"); 
     filter.setPriority(1); 
     registerReceiver(dynamicReceiver, filter, 
       "com.google.android.c2dm.permission.SEND", null); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(dynamicReceiver); 
    } 

    private final BroadcastReceiver dynamicReceiver 
      = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      // TODO Handle C2DM 

      // blocks passing broadcast to StaticReceiver instance 
      abortBroadcast(); 
     } 
    }; 
} 

주의! 브로드 캐스트를 먼저 잡으려면 dynamicReceiver IntentFilter의 우선 순위가 StaticReceiver 인스턴스 IntentFilter의 우선 순위보다 높아야합니다 (기본 우선 순위는 '0'임).

추신. Google Cloud Messaging Service에서 발급 한 브로드 캐스트가 주문 된 브로드 캐스트 인 것으로 보입니다.원래 아이디어 저자 : CommonsWare

1

가장 쉬운 방법은 활동이 실행 여부 확인하기 :

Context context = MyActivity.this; 

if (! ((Activity) context).isFinishing()) { 
    // Activity is running 
} else { 
    // Activity has been finished 
} 

참고 : 활동이 실행되고 있지 않은 경우 당신은 어떤 UI 관련 작업을 수행해서는 안된다.

관련 문제