我已关注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
,这也不理想或不可靠。
答案 0 :(得分:1)
问题在于一个名为Localytics的库,它也处理推送通知。与GCM设置无关。
答案 1 :(得分:0)
如果空闲时间过长,系统可能会终止应用程序,但该示例会记录每当GCM消息到达时系统启动/调用的GcmBroadcastReceiver
。该接收器依次启动一个服务,然后创建通知。
如果应用程序未运行,此模式也有效 - 实际上,系统会启动应用程序。如有必要,广播接收器作为应用程序的一部分。如果您的应用不是这种情况,那么您做错了。
检查您的清单文件,看看是否正确指定了广播接收器和服务。
编辑:通过您的清单文件告诉我,我认为您没有为广播接收器和服务提供正确的名称。你必须在这里提供完全合格的班级名称(例如com.example.GcmBroadcastReceiver
),或者你可以将包名称留在你的应用程序中,但是你至少要提供.GcmBroadcastReceiver
(头脑)领先的点!)。