美文网首页Android开发
如何保证Service不被杀死

如何保证Service不被杀死

作者: 学不好语文的LJ码农 | 来源:发表于2016-12-07 11:07 被阅读372次

    以下内容整理自互联网,仅用于个人学习


    1. onStartCommand方法,返回START_STICKY

    将Service设置成START_STICKY,在运行onStartCommand后Service进程被kill,那将保留在开始状态,但是不保留那些传入的intent。不久后Service就会再次尝试重新创建,因为保留在开始状态,在创建Service后将保证调用onstartCommand。如果没有传递任何开始命令给Service,那将获取到null的intent。重传intent,保持和重启前一样。

    当Service因内存不足被kill,当内存还充足的时候,Service被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了。

    2. 提升Service优先级

    在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。

    3. 提升service进程优先级

    Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。

    Android进程的优先级从高到低依次为:

    1. 前台进程( FOREGROUND_APP)
    1. 可视进程(VISIBLE_APP )
    2. 次要服务进程(SECONDARY_SERVER )
    3. 后台进程 (HIDDEN_APP)
    4. 内容供应节点(CONTENT_PROVIDER)
    5. 空进程(EMPTY_APP)

    当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。

    如果在极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()

    4. onDestroy方法里重启service

    直接在onDestroy()里startService或使用service + broadcast方式,就是当service走到onDestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;

    当使用类似某某管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证。

    5. 监听系统广播判断Service状态

    通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限。

    这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便。

    6. root之后将app放到system/app变成系统级应用

    7. 放一个像素在前台(手机QQ)

    相关文章

      网友评论

        本文标题:如何保证Service不被杀死

        本文链接:https://www.haomeiwen.com/subject/lfydmttx.html