猿问

我们如何防止服务被操作系统杀死?

Service在我的应用程序中使用它,它需要运行直到卸载我的应用程序,但是问题是它被操作系统杀死了。

我们如何防止它被操作系统杀死?或者,如果它被杀死了,我们可以通过编程方式重新启动该服务吗?


偶然的你
浏览 582回答 3
3回答

胡说叔叔

您可以使用startForeground()在前台运行服务。前台服务是一种被认为是用户积极了解的服务,因此不适合当内存不足时被系统杀死的服务。但是请记住,前台服务必须为状态栏提供一条通知(在此处阅读),并且除非该服务被停止或从前台中删除,否则不能取消该通知。注意:这仍然不能绝对保证在内存极低的情况下不会终止该服务。这只会使其被杀的可能性降低。

一只斗牛犬

最近,我对您遇到的同样问题感到困惑。但是现在,我找到了一个很好的解决方案。首先,您应该知道,即使您的服务已被OS杀死,您的服务的onCreate方法也将在短时间内被OS调用。因此,您可以使用onCreate方法执行以下操作:@Overridepublic void onCreate() {&nbsp; &nbsp; Log.d(LOGTAG, "NotificationService.onCreate()...");&nbsp; &nbsp; //start this service from another class&nbsp; &nbsp; ServiceManager.startService();}@Overridepublic void onStart(Intent intent, int startId) {&nbsp; &nbsp; Log.d(LOGTAG, "onStart()...");&nbsp; &nbsp; //some code of your service starting,such as establish a connection,create a TimerTask or something else}“ ServiceManager.startService()”的内容为:public static void startService() {&nbsp; &nbsp; Log.i(LOGTAG, "ServiceManager.startSerivce()...");&nbsp; &nbsp; Intent intent = new Intent(NotificationService.class.getName());&nbsp; &nbsp; context.startService(intent);}但是,此解决方案仅适用于您的服务被GC终止的情况。有时我们的服务可能会被程序管理器的用户终止。在这种情况下,您的职业将被杀死,并且您的服务将永远不会被实例化。因此,您的服务无法重新启动。但是好消息是,当PM终止您的服务时,它将调用您的onDestroy方法。因此我们可以使用该方法来做些事情。&nbsp; &nbsp; @Overridepublic void onDestroy() {&nbsp; &nbsp; Intent in = new Intent();&nbsp; &nbsp; in.setAction("YouWillNeverKillMe");&nbsp; &nbsp; sendBroadcast(in);&nbsp; &nbsp; Log.d(LOGTAG, "onDestroy()...");}字符串“ YouWillNeverKillMe”是一个自定义操作。此方法最重要的是,在发送广播之前不要添加任何代码。由于系统不会等待onDestroy()的完成,因此必须尽快发送广播。然后在manifast.xml中注册一个接收者:<receiver android:name=".app.ServiceDestroyReceiver" >&nbsp; &nbsp; &nbsp; &nbsp; <intent-filter>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <action android:name="YouWillNeverKillMe" >&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </action>&nbsp; &nbsp; &nbsp; &nbsp; </intent-filter>&nbsp; &nbsp; </receiver>最后,创建一个BroadcastReceiver,并使用onReceive方法启动服务:@Overridepublic void onReceive(Context context, Intent intent) {&nbsp; &nbsp; Log.d(LOGTAG, "ServeiceDestroy onReceive...");&nbsp; &nbsp; Log.d(LOGTAG, "action:" + intent.getAction());&nbsp; &nbsp; Log.d(LOGTAG, "ServeiceDestroy auto start service...");&nbsp; &nbsp; ServiceManager.startService();}希望这对您有所帮助,请原谅我那可怜的英语。
随时随地看视频慕课网APP

相关分类

Android
我要回答