2012-05-27 60 views
6

我使用C2DM發現,我BroadcastReceivers傳播C2DM事件到本地服務。該服務通過將ID發送到我的web服務器來完成註冊,它負責讓設備知道新消息,但是如果應用程序(其中一個活動)已啓動,我們希望使用新數據向該活動發送意圖它可以被更新,如果不是NotificationManager用來通知用戶的話。如果Android的活動運行

是,如何知道活動的問題正在運行?應用程序對象不是一個選項,因爲服務是顯然將存在的應用程序的一部分。註銷每個應用程序的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

第一種方法看起來很有趣,但我想知道是否有任何活動正在運行,或者更喜歡如果我的應用程序正在運行(服務排除在外)靜態方法os不好,因爲活動可能有多個實例,也許Application mutex會訣竅... – 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

,如果你想處理你的活動進入谷歌雲消息(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')。

PS。看起來Google雲消息服務發佈的廣播是有序廣播。最初的想法作者:CommonsWare

1

最簡單的方法來檢查是否活動正在運行或不爲:

Context context = MyActivity.this; 

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

注意:如果活動沒有運行,你不應該執行任何用戶界面相關操作。