zoukankan      html  css  js  c++  java
  • 关于android service 重启

      现在有这样的需求,防止自己的app被其他的应用程序(比如qq手机管家)杀死,该怎么实现呢。我们知道app都是运行在进程中的,android是怎样管理这些进程的呢。要想app不被杀死,只要做到进程不被结束就解决了问题。但是不幸的是,第三方app很容易利用系统的api(比如killBackProgress())轻易杀死其他进程。那该怎么办呢?

       目前有这样的解决方案。在本进程被其他应用程序杀死后,就立即重启,这样就可以间接防止进程被结束(其实已结束了,只重新开启)。至今为止,还未知道怎样完全防止第三方结束本进程,正在寻找中。。。。。。。。。。。。。

       现在问题又来了,自己的应用怎么知道什么时候被杀死了,杀死之后又怎么重启呢?答案是,无法知道,自己也无法重启。幸好android提供了service,android规范中指出进驻有service的进程的优先级别很高,除非是本应用自己调用stopService结束服务,否则即使第三方应用杀死该进程,而后进程也会自己重启(服务也重启)

       所以说,要想进程被杀死后能自动重启,那么只需要在该进程中开启某个服务就可以了。

    补充:

    1、通过 设定-》应用程序-》运行  结束某个进程或服务,这样进程或服务不会重启。

    2、如果采用bindService()方法启动服务,那么在 设定-》应用程序-》运行是看不到此项服务信息的。这样的服务也可被”qq手机管家“永远杀死,不在重启。

    结论:无法防止其他应用程序杀死自己进程或服务(系统自带的服务管理外),但是可以在杀死后重启。

    另外,可以设置service属性:

    每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,这个方法return 一个int值,return 的值有四种:
     
    START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
     
    START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
     
    START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
     
    START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
  • 相关阅读:
    MySQL复制表结构和内容到另一张表中的SQL
    Page Cache(页缓存)
    mmap 与 munmap
    Shenandoah 与 ZGC
    InfluxDB入门
    SparkSQL 疫情Demo练习
    CyclicBarrier 解读
    mysql存储过程
    Kibana7.3.2与ElasticSearch7.3.2的集成
    Greenplum简介
  • 原文地址:https://www.cnblogs.com/kobe8/p/3079839.html
Copyright © 2011-2022 走看看