Android 使用registerReceiver的C2DM接收机动态寄存器
我可以使用清单中的Android 使用registerReceiver的C2DM接收机动态寄存器,android,broadcastreceiver,android-c2dm,Android,Broadcastreceiver,Android C2dm,我可以使用清单中的成功地向C2DM注册我的android应用程序。但是,如果我从清单中删除,并使用上下文的registerReceiver方法注册我的接收者,我将收到服务不可用错误响应。我已经在模拟器和真实设备中重现了这种行为 是否可以动态注册C2DM接收器 这是我删除的清单的片段: <receiver android:name=".service.C2DM.C2DMReceiver" android:permission="com.google.android.c2dm.permissi
成功地向C2DM注册我的android应用程序。但是,如果我从清单中删除
,并使用上下文的registerReceiver方法注册我的接收者,我将收到服务不可用错误响应。我已经在模拟器和真实设备中重现了这种行为
是否可以动态注册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>
您可以在清单文件中注册receiver C2DMReceiver,并将意图分派给real BroadcastReceiver来处理它。当系统发送广播时,如果在清单中声明了匹配的意图筛选器,则会启动应用程序来处理意图。由于C2DM的性质,动态安装广播接收器是没有用的,因为当接收到C2DM消息时,应用程序可能没有运行。如果它没有运行,它将不会为动态安装的接收器启动。在活动中的动态注册的BroadcastReceiver中接收注册的c2dm/gcm意图可能是有意义的,但与原始作者一样,我发现这不起作用(JB上的gcm除外)。这有什么原因吗?我在任何地方的文档中都找不到这个限制。谢谢。这就是我所做的,但我接受了另一个答案,因为我要求的更多是一个推理而不是一个解决办法。@hectorct我有一个非常相似的答案。如果我以友好方式注册BroadcastReceiver,我的应用程序将不再发送消息。当我切换回maniferst模式时,它正在工作。也许你及时发现了。
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");
}
}
}