在尝试在android应用程序中实现通知时,我发现如果用户从运行应用程序列表中关闭该应用程序,通知将不再有效(顶部向下滑动,然后水平滑动-而不是强制退出,这将根据谷歌规范正确关闭所有未来调用(。使用后退按钮有时会导致同样的行为,尽管并非总是如此。
根据我所研究的一切,我的理解是,只有用户的强制停止才能阻止广播接收器被调用。
以下是安卓清单中的相关代码和设置,请注意,当应用程序打开或通过主页按钮离开时,一切都很好。
安卓清单相关章节:
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver
android:name="mypackage.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="mypackage.android" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="mypackage.android" />
</intent-filter>
</receiver>
<service
android:name="mypackage.gcm.GCMIntentService"
android:stopWithTask="false"
android:exported="false">
</service>
这是我的类,它覆盖WakefulBroadcastReceiver
:
public class GCMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
try {
// 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);
} catch(Exception e) {
//Log it, and move on
Log.d("GCMBroadcastReceiver", "onReceive", e);
}
}
看起来您遇到了与我相同的问题,我想使用GCMReceiver和GCMListenerService对您也不起作用。此问题是已报告的错误。希望罚单中的变通办法能对你有所帮助。