我遇到了这个问题,但我没有找到解决问题的方法。
我正在构建一个服务,必须在特定时间做一些事情,所以我有一个AlarmManager来计算计时器。
我从Activity启动服务,通过getBaseContext().startService(intent)
,我将AlarmManager设为mAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME, mPendingIntent);
The PedingIntent is: mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(filter), 0);
我正在注册本地接收器,如下所示:registerReceiver(mReceiver, new IntentFilter(filter));
我面临的问题是:服务正常运行,没有错误,但如果我从“最近的应用程序”中删除我的应用程序,服务将保持运行,直到AlarmManager触发我的PendingIntent。它会在一段随机时间(可能是几秒或几分钟)后崩溃,重新启动并且不会再崩溃。
服务正在前台运行。
请记住:服务不会立即崩溃,只有当我的AlarmManager触发我的PendingIntent(应该调用我的BroadcastReceiver)时它才会崩溃。
我不知道为什么会发生这种情况,我可以在PendingIntent上设置一些标志吗?
让我们说,在我上面写的所有内容之后服务“幸免于难”,如果我只是打开我的应用程序然后将其从“最近”删除我的应用程序,我的服务再次崩溃。
还有另一种方法可以用来做唤醒设备的定时器任务,以及AlarmManager吗?
当我从最近的窗口或类似的东西中删除我的应用程序时,是否有可以过滤的侦听器事件或Intent操作?类似于isAppRemovedFromRecents()
或isAppTrullyDiesFromTheSystem()
的内容。这样我可以使用接收器重启我的服务。
我还考虑过只为服务制作第二个应用程序,这样我就可以避免所有这些问题,但看起来并不“正确”。
我该怎么办?
修改
过滤器的值:String filter = "com.mypackage.TIMERFILTER";
LogCat:Scheduling restart of crashed service com.mypackage/.MyService in 5000ms
提前致谢
答案 0 :(得分:0)
我找到了一个解决方案,经过大量研究后,我终于找到了here
正如我想的那样,错误发生在PendingIntent上。
自API 16(Jelly Bean)以来,Android API上存在一些错误或未记录的更改。而不是:
final String filter = "MYFILTER"
final PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(filter), 0);
你应该这样做:
final String filter = "MYFILTER"
final Intent piIntent = new Intent(filter);
if(Build.VERSION.SDK_INT >= 16) piIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
final PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 1, piIntent, 0); // requestCode must be 1, not 0
通过这种方式,您可以启动该服务,离开应用程序并将其从“最近的应用程序”中转出,服务不会崩溃。
测试了摩托罗拉RAZRi,android 4.1.2,我不知道它是否适用于较旧的Android版本,请在此测试并分享:)