我有一个问题,GCM消息推送到我的设备,但有时不会路由到我的应用程序,特别是当我的应用程序刚刚启动时。我把以下行读到了logcat:
I/GCM ( 5227): GCM message com.info.chat 0:1423053966153011%64523c3ff9fd7dcc
D/ConnectivityService( 774): handleInetConditionHoldEnd: net=0, condition=100, published condition=100
I/Ads (20754): Ad is not visible. Not refreshing ad.
I/Ads (20754): Scheduling ad refresh 60000 milliseconds from now.
W/GCM-DMM ( 5227): Force release of GOOGLE_C2DM lock
然后我没有看到我的应用程序处理邮件的任何日志。
然而,有时,它会成功,日志看起来像:
I/GCM ( 5227): GCM message com.info.chat 0:1423054244269861%64523c3ff9fd7dcc
D/com.info.chat( 8263): <8263>[GCMBroadcastReceiver.onReceive 24]Received a GCM Broadcast : Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=com.info.chat cmp=com.info.chat/.GCMBroadcastReceiver (has extras) }
在我的程序中,我创建了GCMBroadcastReceiver来监听GCM广播
public class GCMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Received a GCM Broadcast : "+intent);
// 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);
}
和清单:
<permission android:name="com.info.chat.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.info.chat.permission.C2D_MESSAGE" />
<receiver
android:name="com.info.chat.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.info.chat" />
</intent-filter>
</receiver>
那么任何人都可以帮助确保消息应该路由到我的应用程序吗?
答案 0 :(得分:1)
Google保证向设备投放GCM / FCM消息。一旦到达设备,Google Play服务就会将其广播到已注册的客户端(如果尚未启动,则会启动客户端的进程)。因此,如果您的应用/服务未收到GCM消息,则表明您的应用流程已经“糟糕”。当您的应用程序频繁崩溃以至于OS强制停止时会发生这种情况;在这个&#39;坏&#39;状态,您的应用无法接收任何GCM消息。
Logcat将显示如下所示的日志,表示已取消的广播:
12-06 18:37:31.802 3566-3566 /? W / GCM-DMM:广播意图回调: result = CANCELED forIntent { ACT = com.google.android.c2dm.intent.RECEIVE pkg = your_pkg_name(有额外内容)}
另请注意,当您的应用崩溃时,崩溃对话框会停留5分钟;在这5分钟内,您的应用程序既不会收到任何FCM消息,也不会收到任何其他外部广播(例如,在ACTION_POWER_CONNECTED清单中注册的广播等)。一旦这5分钟过去并且对话框消失,那么您的应用程序将正常运行。
一个典型的案例是一个应用程序,其中onCreate()本身有一个例外。这个将成为糟糕进程的主要候选者。 处于不良状态时,应用程序不会通过Playstore自动更新;但是可以通过去Playstore或重启手机来手动更新。 注意:至少我对Nexus 5x的体验是,我们不需要取出电池就可以让应用程序摆脱糟糕状态;重启就足够了。