面试题整合第二期:关于Service.
1、Service 两种启动方式:
- 使用context.startService(new Intent(context,ServiceName.class))形式,service生命周期与activity无关。
-
使用bindService启动,activity销毁,service也销毁。
无论哪种方式都要在manifest注册
2、Service 生命周期

注:新版的图用onStartCommand代替了onStart
3 、 如何保证Service在后台不被kill
- 重写onStartCommand返回START_STICKY,START_STICKY是service被kill掉后自动重写创建
-
在onDestroy里启动service
-
监听系统广播,如果还能监听到系统广播就说明服务没有被Kill
-
Application加上Persistent属性,让应用变成随系统关闭而关闭。
-
提升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的情况。