Android GCM推送已发送到设备,但有时无法路由到我的应用程序

时间:2015-02-04 13:31:19

标签: android notifications push google-cloud-messaging

我有一个问题,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>       

那么任何人都可以帮助确保消息应该路由到我的应用程序吗?

1 个答案:

答案 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的体验是,我们不需要取出电池就可以让应用程序摆脱糟糕状态;重启就足够了。