Service

启动方式

StartService/stopService

启动:onCreate() -> onStartCommand() -> running

停止:stop -> onDestory()

bindService/unbindService

启动:onCreate() -> onBind() -> running

停止:stop -> onUnbind() -> onDestory()

两者的区别

  • 生命周期不一样
    startService是调用这个与服务者是分开的,调用者的生命周期不影响服务者的生命; bindService是讲服务者生命周期和调用者绑定上,即调用者生命周期结束了,那么服务者也就结束了。
  • bind方式调用者如何获取绑定后的Service
    onBind回调方法将返回给客户端一个IBinder接口实例,IBinder允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。我们需要IBinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象。
  • 同时使用start和bind的场景
    这个就是一个服务既被绑定又被启动,场景是既想服务长期在后台运行,同时又希望与正在运行的服务取得联系,保持交互。
    Service的终止,需要unbindService和stopService同时调用才行。

服务方式

本地服务(Local Service)

远程服务(Remote Service)

区别就在于是否运行在应用的同一个线程中。

前台、后台

我们一般开启的服务是后台服务,而前台服务更不容易被系统回收。

从技术角度概括一下现在普遍的防杀方法

  • Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
  • 通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill
  • 双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
  • QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
  • 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)
  • Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行):
    • 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
    • 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
    • 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
  • 联系厂商,加入白名单

results matching ""

    No results matching ""