为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2019-11-25 11:14:05
我Service在我的应用程序中使用它,它需要运行直到卸载我的应用程序,但是问题是它被操作系统杀死了。我们如何防止它被操作系统杀死?或者,如果它被杀死了,我们可以通过编程方式重新启动该服务吗?
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以使用startForeground()在前台运行服务。


前台服务是一种被认为是用户积极了解的服务,因此不适合当内存不足时被系统杀死的服务。


但是请记住,前台服务必须为状态栏提供一条通知(在此处阅读),并且除非该服务被停止或从前台中删除,否则不能取消该通知。


注意:这仍然不能绝对保证在内存极低的情况下不会终止该服务。这只会使其被杀的可能性降低。


查看完整回答
反对 回复 2019-11-25
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

最近,我对您遇到的同样问题感到困惑。但是现在,我找到了一个很好的解决方案。首先,您应该知道,即使您的服务已被OS杀死,您的服务的onCreate方法也将在短时间内被OS调用。因此,您可以使用onCreate方法执行以下操作:


@Override

public void onCreate() {

    Log.d(LOGTAG, "NotificationService.onCreate()...");

    //start this service from another class

    ServiceManager.startService();

}

@Override

public void onStart(Intent intent, int startId) {

    Log.d(LOGTAG, "onStart()...");

    //some code of your service starting,such as establish a connection,create a TimerTask or something else

}

“ ServiceManager.startService()”的内容为:


public static void startService() {

    Log.i(LOGTAG, "ServiceManager.startSerivce()...");

    Intent intent = new Intent(NotificationService.class.getName());

    context.startService(intent);

}

但是,此解决方案仅适用于您的服务被GC终止的情况。有时我们的服务可能会被程序管理器的用户终止。在这种情况下,您的职业将被杀死,并且您的服务将永远不会被实例化。因此,您的服务无法重新启动。但是好消息是,当PM终止您的服务时,它将调用您的onDestroy方法。因此我们可以使用该方法来做些事情。


    @Override

public void onDestroy() {

    Intent in = new Intent();

    in.setAction("YouWillNeverKillMe");

    sendBroadcast(in);

    Log.d(LOGTAG, "onDestroy()...");

}

字符串“ YouWillNeverKillMe”是一个自定义操作。此方法最重要的是,在发送广播之前不要添加任何代码。由于系统不会等待onDestroy()的完成,因此必须尽快发送广播。然后在manifast.xml中注册一个接收者:


<receiver android:name=".app.ServiceDestroyReceiver" >

        <intent-filter>

            <action android:name="YouWillNeverKillMe" >

            </action>

        </intent-filter>

    </receiver>

最后,创建一个BroadcastReceiver,并使用onReceive方法启动服务:


@Override

public void onReceive(Context context, Intent intent) {

    Log.d(LOGTAG, "ServeiceDestroy onReceive...");

    Log.d(LOGTAG, "action:" + intent.getAction());

    Log.d(LOGTAG, "ServeiceDestroy auto start service...");

    ServiceManager.startService();

}

希望这对您有所帮助,请原谅我那可怜的英语。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 581 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信