安卓面试题: 2 - 关于 Service

5,821 阅读1分钟
原文链接: www.iwfu.me

面试题整合第二期:关于Service.

1、Service 两种启动方式:

  1. 使用context.startService(new Intent(context,ServiceName.class))形式,service生命周期与activity无关。
  2. 使用bindService启动,activity销毁,service也销毁。

无论哪种方式都要在manifest注册

2、Service 生命周期

Service生命周期

注:新版的图用onStartCommand代替了onStart

3 、 如何保证Service在后台不被kill

  1. 重写onStartCommand返回START_STICKY,START_STICKY是service被kill掉后自动重写创建
  2. 在onDestroy里启动service

  3. 监听系统广播,如果还能监听到系统广播就说明服务没有被Kill

  4. Application加上Persistent属性,让应用变成随系统关闭而关闭。

  5. 提升Service优先级:

  • 设置android:priority = “1000”

  •  Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android将进程分为6个等级,它们按优先级顺序由高到低依次是:    1.前台进程( FOREGROUND_APP)
   2.可视进程(VISIBLE_APP )
   3. 次要服务进程(SECONDARY_SERVER )
   4.后台进程 (HIDDEN_APP)
   5.内容供应节点(CONTENT_PROVIDER)
   6.空进程(EMPTY_APP) 当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground 将service放到前台状态。这样在低内存时被kill的几率会低一些。

其他: 像qq放一个像素在桌面

4、IntentService

IntentService是通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。

持续更新补充~~~