5

<receiver>マニフェストのを使用して、AndroidアプリをC2DMに正常に登録できます。ただし、マニフェストからを削除し<receiver>、コンテキストのメソッドregisterReceiverを使用してレシーバーを登録すると、SERVICE_NOT_AVAILABLEエラー応答が返されます。この動作をエミュレーターと実際のデバイスで再現しました。

C2DMレシーバーを動的に登録することは可能ですか?

これは私が削除したマニフェストの断片です:

<receiver android:name=".service.C2DM.C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
      <category android:name="mytestapp" />
  </intent-filter>
  <intent-filter>
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      <category android:name="mytestapp" />
  </intent-filter>
</receiver>

そしてここにコードがあります:

public class C2DMReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String registration = intent.getStringExtra("registration_id");
        if (intent.getStringExtra("error") != null) {
            //TODO: Registration failed, should try again later.
            Log.e("MyTestAppC2DM", "C2DM Error = " + intent.getStringExtra("error"));
        } else if (intent.getStringExtra("unregistered") != null) {
            Log.d("MyTestAppC2DM", "C2DM Unregistered");
        } else if (registration != null) {
            Log.d("MyTestAppC2DM","C2DM registration_id = " + registration);
        } else {
            Log.w("MyTestAppC2DM", "C2DM No registration_id");
        }
    }

    public static void register(Context context){
        /* BEGIN OF DYNAMIC REGISTER */
        C2DMReceiver c2dmReceiver = new C2DMReceiver();

        IntentFilter receiveIntentFilter = new IntentFilter();
        receiveIntentFilter.addAction("com.google.android.c2dm.intent.RECEIVE");
        receiveIntentFilter.addCategory("mytestapp");
        context.registerReceiver(c2dmReceiver, receiveIntentFilter, "com.google.android.c2dm.permission.SEND", null);

        IntentFilter registrationIntentFilter = new IntentFilter();
        registrationIntentFilter.addAction("com.google.android.c2dm.intent.REGISTRATION");
        registrationIntentFilter.addCategory("mytestapp");
        context.registerReceiver(c2dmReceiver, registrationIntentFilter, "com.google.android.c2dm.permission.SEND", null);

        /*END OF DYNAMIC REGISTER*/

        Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
        registrationIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0));
        registrationIntent.putExtra("sender", "mysender@gmail.com");
        ComponentName service = context.startService(registrationIntent);
        if(service!=null){
            Log.d("MyTestAppC2DM","C2DM Registration sent");
        }else{
            Log.d("MyTestAppC2DM","C2DM Service not found");
        }   
    }
}
4

3 に答える 3

3

レシーバー C2DMReceiver をマニフェスト ファイルに登録し、インテントを実際の BroadcastReceiver にディスパッチして処理することができます。

于 2012-05-23T10:36:04.820 に答える
2

ブロードキャストがシステムによって送信されると、一致するインテント フィルターがマニフェストで宣言されている場合、インテントを処理するアプリケーションが開始されます。C2DM の性質上、C2DM メッセージを受信したときにアプリケーションが実行されていない可能性があるため、ブロードキャスト レシーバーを動的にインストールすることは役に立ちません。実行されていない場合、動的にインストールされたレシーバーに対して開始されません。

于 2012-06-19T11:54:20.300 に答える
0

アクティビティで動的に登録された BroadcastReceiver でc2dm/gcm REGISTEREDインテントを受信することは理にかなっているかもしれませんが、元の作成者と同様に、これが機能していないことがわかりました (JB の GCM を除く)。これには理由がありますか?ドキュメントのどこにもこの制限が見つかりません。

于 2012-07-22T00:16:53.897 に答える