你好,我遇到背景限制的麻烦。 我目前正在测试的手机是Android 8.1上的Nokia 7 plus
我的应用暂时运行良好,有一个 jobScheduler 可以在后台每20分钟执行一次任务。
但是在某些时候,为了节省电池,我相信android关闭了该应用程序,之后广播接收器无法按预期工作:
2019-02-28 10:13:25.925 3000-3000/? W/GCM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=myapp.pkg (has extras) }
当应用程序在后台运行且未强制停止时,仍显示消息“广播意图回调:result = CANCELLED” ,但通知有效。
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(),"Gcm Info Received");
new Intent(context, GcmIntentService.class);
GcmIntentService.enqueueWork(context, intent);
}
当用电池强制停止时,我的广播接收器中的日志“收到Gcm信息” 甚至没有显示。
清单
<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="myapp.pkg" />
</intent-filter>
</receiver>
在我的 GcmIntentService 中,我在发送广播之前添加了以下标志:
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);
通知消息非常重要,我认为android自动强制停止应用程序确实很愚蠢。只有用户交互才可以做到这一点...
我看到了这个线程:https://github.com/firebase/quickstart-android/issues/89#issuecomment-233786785
参与者这样的话应该是用户有意做的。就我而言,该应用程序从昨天上午11点到今天凌晨1点一直在后台运行,然后才停止运行,而不是被我...
我还尝试从该应用程序的签名apk版本对其进行测试,因为我看到有人说,仅当该应用程序处于调试状态时,才会发生此错误。
我也阅读了该线程:How to restart Service after Force Stop of app
所以我想知道是否有真正的解决方案,而不是要求每个用户在设置中关闭电池优化?
解决方案可能是应用没有被电池优化强行杀死,或者在强行杀死后以某种方式重新启动了应用。