,如果你想處理你的活動進入谷歌雲消息(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
第一種方法看起來很有趣,但我想知道是否有任何活動正在運行,或者更喜歡如果我的應用程序正在運行(服務排除在外)靜態方法os不好,因爲活動可能有多個實例,也許Application mutex會訣竅... – codeScriber
我可能是錯的,但我認爲這隻會檢查任務中當前的頂級活動。如果是這樣,那麼同一項任務中的其他活動(暫停或停止)又如何呢? –
請勿使用第一種方法。從ActivityManager文檔:「注意:此方法僅用於調試和顯示任務管理用戶界面,不應將其用於應用程序中的核心邏輯,例如根據此處找到的信息來決定不同的行爲。」 – yarian