Service
一、声明
需要在清单中声明,但是如果不声明不会崩溃,只会抛出异常。
android:exported true则允许外部调用
android:process 指定进程名称
二、启动模式
1:startService
onCreate(只执行一次)-onStartCommand(启动多次执行多次)-onDestory(调用stopSelf或stopService,强制kill时不会执行)
onStartCommand(Intent intent,int flag,int startId):
flag:控制内存不足是是否重启Service以及是否保留最后一个非空intent。
startId:每执行一次加1。
2:bindService
onCreate(只执行一次)-onBind(单个客户只能绑定一次,可被多个客户绑定,可通过iBinder接口进行通信)-onUnBind(解除绑定,如果当前没有绑定则会崩溃。如果返回true,则下次绑定是执行onReBind而不是onBind)-onDestory(在所有客户全部解绑后销毁,强制kill时不会执行)
同进程通信:继承Binder
onBind中会返回IBinder对象。而Client需要实现ServiceConnection接口。
不同进程通信(ipc):Messenger
双方都需要创建Messenger对象,在onBind时返回Messenger的getBInde对象,获取时通过new Messenger(binder)创建对象。与Handler进行绑定,从而进行双向通信。
*可以于一个已经启动的Service进行绑定,但是销毁时必须执行onStopSelf或stopService,以及onUnBInd。
前台Service:
不容易被杀死,会在通知栏显示。只需要在onCreate中创建Notification对象并调用startForcground方法。
IntentService:
主要用于处理长期的任务。默认会在自线程中执行,在执行完毕后会自动销毁。需要实现onHandlerIntent方法。
保证不被杀死:
1:startCommend中的flag,START_STICKY,在内存不足时重启,但是传入为null的intent;START_NOT_STICKY,在内存不足时不重启;START_REDELIVER_INTENT:在内存不足时重启,传入最后一个intent。
2:android:priority:1000 提高优先级
3:设置为前台Service。
4:onDestory中启动。
5:Broadcast监听系统广播判断Service并重启。
6:守护进程。开启两个Service并判断对方是否被杀死,会消耗资源。