PendingIntent正在杀死该服务

时间:2014-01-20 16:10:49

标签: android android-service alarmmanager android-pendingintent

我遇到了这个问题,但我没有找到解决问题的方法。

我正在构建一个服务,必须在特定时间做一些事情,所以我有一个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

提前致谢

1 个答案:

答案 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版本,请在此测试并分享:)