次のアプローチは、受信する Google Cloud メッセージ (C2DM) をアクティビティ (実行中の場合) で処理する場合、またはアクティビティが実行されていない場合に通知を発行する場合に適しています。
マニフェスト ファイルに BroadcastReceiver を 1 つ登録します。このレシーバーは、アプリケーションが実行されていないときはいつでも C2D メッセージを処理します。アクティビティに別の BroadcastReceiver をプログラムで登録します。この受信者は、アクティビティが実行されているときはいつでも C2D メッセージを処理します。
AndroidManifest.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 Cloud Messaging Service が発行するブロードキャストは、順序付きブロードキャストのようです。原案作者:CommonsWare