pcu*_*pcu 5 android broadcastreceiver google-cloud-messaging
我正在我的应用程序中实现gcm通知.因为我使用我的代码生成大量具有不同包名称的应用程序,所以我无法使用标准的mypackage.GCMIntentService名称.生成应用程序时,我只在Manifest中更改并更改R类的导入.所以我强迫自己的BroadcastReceiver
public class GCMReceiver extends GCMBroadcastReceiver {
@Override
protected String getGCMIntentServiceClassName(Context context) {
return GCMIntentService.class.getName();
}
}
Run Code Online (Sandbox Code Playgroud)
无论包名称如何,都返回GCMIntentService的名称.
这是我的清单:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="org.rferl.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="org.rferl.permission.C2D_MESSAGE" />
<service
android:name="org.rferl.service.GCMIntentService"
android:enabled="true" />
<receiver
android:name="org.rferl.GCMReceiver"
android:enabled="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="org.rferl" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
一切正常,我可以注册,取消注册,接收消息.但是当应用程序没有运行时,不会调用GCMIntentService.onMessage.我在清单中遗漏了什么吗?为什么系统没有启动服务?
Pan*_*ang 14
GCMIntentService/的包/类名GCMBroadcastReceiver(使用Eclipse ADT)注意:建议您在进行以下更改之前验证是否可以通过GCM接收消息.要使用应用程序的默认程序包名称在Android应用程序中实现GCM ,请参阅GCM:入门.
要更改应用的包名称(例如,新包名称= com.example.newpackage),
在AndroidManifest.xml,在更新包名称permission和uses-permission为C2D_MESSAGE:
<permission android:name="com.example.newpackage.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.newpackage.permission.C2D_MESSAGE" />
Run Code Online (Sandbox Code Playgroud)在AndroidManifest.xml中,更新包名category的receiver:
<receiver
android:name="com.example.oldpackage.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" > <!-- Not this one!! -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.newpackage" /> <!-- This one!! -->
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)GCMIntentService如果您的应用程序包名称是com.example.newpackage,则GCMIntentService必须调用com.example.newpackage.GCMIntentService.如果不,
创建一个新的类extends GCMBroadcastReceiver并覆盖getGCMIntentServiceClassName():
public class MyBroadcastReceiver extends GCMBroadcastReceiver
{
@Override
protected String getGCMIntentServiceClassName(Context context)
{
return MyIntentService.class.getName(); // Don't hard-code like "com.example.oldpackage.MyIntentService", see http://stackoverflow.com/a/936696/1402846
}
}
Run Code Online (Sandbox Code Playgroud)
这是基于Google关于GCMBroadcastReceiver的文档:
默认情况下,
GCMBaseIntentService该类属于应用程序主包并且已命名DEFAULT_INTENT_SERVICE_CLASS_NAME.要使用新类,getGCMIntentServiceClassName(Context)必须重写.
在AndroidManifest.xml,更新名称receiver:
<receiver
android:name="com.example.oldpackage.MyBroadcastReceiver"
... >
</receiver>
Run Code Online (Sandbox Code Playgroud)在AndroidManifest.xml,更新名称service:
<service android:name="com.example.oldpackage.MyIntentService" />
Run Code Online (Sandbox Code Playgroud)GCMBroadcastReceiver如果您更改了包/类名GCMBroadcastReceiver:
在AndroidManifest.xml,更新名称receiver:
<receiver
android:name="com.example.oldpackage.NewBroadcastReceiver"
... >
</receiver>
Run Code Online (Sandbox Code Playgroud)验证输入AndroidManifest.xml,包名称应至少出现4次:
在manifest:
<manifest ...
package="com.example.newpackage" ...
Run Code Online (Sandbox Code Playgroud)在permission:
<permission android:name="com.example.newpackage.permission.C2D_MESSAGE" android:protectionLevel="signature" />
Run Code Online (Sandbox Code Playgroud)在uses-permission:
<uses-permission android:name="com.example.newpackage.permission.C2D_MESSAGE" />
Run Code Online (Sandbox Code Playgroud)在category内部intent-filter范围内receiver的GCM广播接收器:
<category android:name="com.example.newpackage" />
Run Code Online (Sandbox Code Playgroud)如果您更改了软件包名称,请在测试前卸载设备/仿真器上的旧应用程序.
onRegistered())已更改.如果您收到了注册ID onRegistered(),您应该在LogCat(tag GCMBroadcastReceiver)中看到类似的内容:
GCMBroadcastReceiver onReceive: com.google.android.c2dm.intent.REGISTRATION
GCMBroadcastReceiver GCM IntentService class: com.example.oldpackage.MyIntentService
Run Code Online (Sandbox Code Playgroud)
验证目标服务的包/类名是否正确.
如果你getGCMIntentServiceClassName(Context)自己覆盖GCMBroadcastReceiver,你应该在LogCat(tag GCMRegistrar)中看到这样的东西:
GCMRegistrar Setting the name of retry receiver class to com.example.oldpackage.MyBroadcastReceiver
Run Code Online (Sandbox Code Playgroud)
验证广播接收器的包/类名是否正确.
您应该将 GCMIntentService 类放入您的根应用程序包中。这里是 org.rferl
<service
android:name=".GCMIntentService"
android:enabled="true" />
Run Code Online (Sandbox Code Playgroud)
和接收器
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.EgoSecure.ma" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19304 次 |
| 最近记录: |