我想让一个IntentService
在后台运行,即使应用程序被杀死。“杀死”我的意思是 * 长时间按home键 * -〉* 查看所有运行的应用程序 * -〉* 将我的应用程序扫到一边 * -〉* 应用程序被杀死 * 或 * 长时间按back键 * -〉* 应用程序被杀死 *
我的代码如下所示。在我的MainActivity中:
Intent intent = new Intent(this, MyService.class);
this.startService(intent);
在我的MyService中:
public class MyService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
System.out.println("MyService started");
run();
}
private void run() {
while (true){
System.out.println("MyService still running");
doSomething();
waitSomeTime();
}
}
}
我看到服务在应用程序 * 打开 * 时运行。当我通过home按钮 * 最小化应用程序 * 时它仍然在运行。当我通过back按钮 * 关闭应用程序 * 时它仍然在运行。但是如果我如上所述杀死它,它将停止。我如何解决这个问题?
9条答案
按热度按时间dnph8jn41#
首先,最简单的方法是在手动终止 * 应用 * 时,在Android中启动广播,并定义自定义**
BroadcastReceiver
**以触发服务重启。现在,让我们跳到代码。
在
YourService.java
中创建服务请注意
onCreate()
方法,在该方法中,我们为高于 Android Oreo 的构建版本启动前台服务的方式有所不同。这是因为最近引入了严格的通知策略,我们必须定义自己的 * 通知通道 * 才能正确显示它们。onDestroy()
方法中的this.sendBroadcast(broadcastIntent);
是异步发送广播的语句,操作名为**"restartservice"
。稍后我们将使用它作为触发器来重新启动服务。这里我们定义了一个简单的Timer任务,它每1秒在
Log
**中打印一个计数器值,同时在每次打印时递增自身。创建广播接收器以响应
Restarter.java
中自定义的广播您刚刚在
YourService.java
中定义的操作名为**"restartservice"
的广播现在应该会触发一个方法,该方法将重新启动您的服务**。这是在Android中使用**BroadcastReceiver
完成的。我们覆盖了
BroadcastReceiver
中的内置onRecieve()
方法,以添加将重新启动服务的语句。startService()
在Android Oreo 8.1及更高版本中无法按预期**工作,因为 * 严格的后台策略 * 将在重启后立即终止服务。因此,对于更高版本,我们使用startForegroundService()
,并显示连续通知以保持服务运行。定义
MainActivity.java
以在应用程序启动时调用服务。这里我们定义了一个单独的
isMyServiceRunning()
方法来检查后台服务的当前状态,如果服务 * 没有 * 运行,我们使用startService()
来启动它。由于应用程序已经在前台运行,我们不需要将服务作为前台服务启动,以防止其自身被终止。
请注意,在
onDestroy()
中,我们专门调用stopService()
,以便调用我们的*覆盖方法***。如果没有这样做,则服务将在应用被终止后 * 自动 * 结束,而不会调用我们在YourService.java
**中修改的onDestroy()
方法最后在您的
AndroidManifest.xml
中注册它们以上三个类都需要在**
AndroidManifest.xml
中单独注册。请注意,我们将具有 action name 的
intent-filter
定义为"restartservice"
,其中Restarter.java
注册为receiver
。这确保了每当系统遇到具有给定 action name 的广播时,都会调用我们的自定义BroadcastReciever
**。如果应用程序已从任务管理器中终止,现在应该会重新启动您的服务。只要用户没有从应用程序设置中**
Force Stop
**应用程序,此服务就会继续在后台运行。更新:感谢Dr.jacky指出了这一点。上面提到的方法只有在调用服务的
onDestroy()
时才有效,这可能不是情况,我不知道。谢谢。0s7z1bwu2#
如果你的服务是由你的应用启动的,那么你的服务实际上是在主进程上运行的。所以当应用被杀死时,服务也会停止。所以你可以做的是,从你的服务的
onTaskRemoved
方法发送广播,如下所示:并且有一个广播接收器,它将再次启动一个服务。我已经试过了。服务从所有类型的杀死重新启动。
i86rm4rw3#
在您的服务中,加入下列程式码。
tzxcd3kk4#
在onstart命令put
START_STICKY
中...此服务不会终止,除非它执行的任务太多,并且内核希望为此终止它...q3aa05255#
这是因为您正在尝试使用IntentService。
IntentService执行以下操作:
在处理完所有启动请求后停止服务,这样您就不必调用stopSelf()。
因此,如果你想让你的服务无限期地运行,我建议你扩展Service类。然而,这并不能保证你的服务会无限期地运行。如果你的服务是低优先级的,那么它仍然有可能被内存不足的内核杀死。所以你有两个选择:
1)通过调用
startForeground()
方法使其在前台运行。2)如果服务被终止,则重新启动它。以下是文档中的一部分示例,其中讨论了在服务被终止后重新启动服务
62lalag46#
在服务类中使用onTaskRemoved
w9apscun7#
您可以在清单中使用
android:stopWithTask="false"
,如下所示,这意味着即使用户通过从任务列表中删除应用程序来终止应用程序,您的服务也不会停止。ibrsph3r8#
你试试下面的代码:
}
lymgl2op9#
下面是我如何触发我的警报时,应用程序是在后台,甚至杀死使用前台服务:
}
}
}