如果应用程序闲置很长时间,Gcm推送通知无效

时间:2014-12-09 07:07:09

标签: android google-cloud-messaging

我已关注Implementing GCM Client的Android GCM客户端教程和here的代码。此外,我在GoogleCloudMessaging.register(PROJECT_ID)的帮助下使用新流程来注册设备。

通知似乎工作正常,存储在服务器上的ID也是一致的。 当应用程序闲置很长时间时会出现问题。应用程序停止收到任何通知,直到它再次打开,之后它再次开始获取新通知(虽然之前的通知已丢失)。

这是常见的事情,还是我唯一面临这个问题的人?

这里有一些代码可以提供更好的洞察力: 清单文件:

<receiver
        android:name="GcmBroadcastReceiver"
        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="myPackage" />
        </intent-filter>
    </receiver>

    <service android:name="GcmIntentServiceNew" />

GcmBroadcastReceiver.java

@Override
public void onReceive(Context context, Intent intent) {
    ComponentName comp = new ComponentName(context.getPackageName(),
            GcmIntentServiceNew.class.getName());
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);
}

最后是GcmIntentServiceNew.java

public class GcmIntentServiceNew extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
    // The getMessageType() intent parameter must be the intent you received
    // in your BroadcastReceiver.
    String messageType = gcm.getMessageType(intent);

    if (!extras.isEmpty()) {  // has effect of unparcelling Bundle
        if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
            //
        } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
            //
        // If it's a regular GCM message, do some work.
        } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
            // Custom code here 
        }
    }
    // Release the wake lock provided by the WakefulBroadcastReceiver.
    GcmBroadcastReceiver.completeWakefulIntent(intent);
}

}

编辑(暂无解决方案)

我测试了很多,现在可以确认通知在一段时间后停止了。我在间隔5-10分钟后测试了10-15个通知,这可能是通知停止的原因吗?

我看到的唯一解决方案是回到GCMRegistrar,这也不理想或不可靠。

2 个答案:

答案 0 :(得分:1)

问题在于一个名为Localytics的库,它也处理推送通知。与GCM设置无关。

答案 1 :(得分:0)

如果空闲时间过长,系统可能会终止应用程序,但该示例会记录每当GCM消息到达时系统启动/调用的GcmBroadcastReceiver。该接收器依次启动一个服务,然后创建通知。

如果应用程序未运行,此模式也有效 - 实际上,系统会启动应用程序。如有必要,广播接收器作为应用程序的一部分。如果您的应用不是这种情况,那么您做错了。

检查您的清单文件,看看是否正确指定了广播接收器和服务。

编辑:通过您的清单文件告诉我,我认为您没有为广播接收器和服务提供正确的名称。你必须在这里提供完全合格的班级名称(例如com.example.GcmBroadcastReceiver),或者你可以将包名称留在你的应用程序中,但是你至少要提供.GcmBroadcastReceiver(头脑)领先的点!)。