我有使用 GCM 的库项目。我正在尝试使用不推荐使用没有 gcm.jar 的方式。让我们从应用程序项目(不是库)的清单开始:
这里我有套餐
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sennin.app"
在这里,我创建了我的权限:
<permission android:name="com.sennin.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />
在这里我和其他人一起使用它:
<uses-permission android:name="com.sennin.app.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这是接收者和 IntentService 条目:
<receiver android:name="com.sennin.app.SenninGCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.sennin.app" />
</intent-filter>
</receiver>
<service android:name="com.sennin.app.GCMIntentService" />
我知道接收器操作com.google.android.c2dm.intent.REGISTRATION
在理论上是多余的,但这是使注册与旧设备一起工作的黑客(顺便在 stackoverflow 上找到)。
我需要补充一点,我的图书馆有 package com.sennin
。
好的,现在让我们转到接收器本身:
public class SenninGCMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("GCM", "RECEIVE GCM");
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
如您所见,在第一行 onReceive 方法是Log
。这个日志很重要,我只想看到这个日志logcat
;)
我省略了消息传递过程的注册部分,因为注册运行良好。我有registration_id
我将它发送到服务器。在我放入registration_id
数据存储的服务器站点上。之后,我只是想发送一些消息。我可以在服务器端看到该消息已发送。我有 message_id 并且没有错误。一切似乎都很好,但接收者永远不会被调用。我想看看这个登录onReceive()
方法,但它永远不会发生。
有什么明显的错误吗?也许我只是不想找到它;)
我只想补充一点,我已经在 Android 2.3 和 Android 4.0.3 上对其进行了测试。