这一篇主要用来补缺Service部分和IPC。
Service
1 Service
的生命周期.
-
onCreate()
:服务第一次被创建时调用 -
onStartComand()
:服务启动时调用 -
onBind()
:服务被绑定时调用 -
onUnBind()
:服务被解绑时调用 -
onDestroy()
:服务停止时调用
2 Service
的启动方式
Service
有两种启动方式:本地启动(Local
)和远程启动(Remote
),
-
Local
方式
其他组件调用Context
的startService()
方法可以启动一个Service
,并回调服务中的onStartCommand()
。如果该服务之前还没创建,那么回调的顺序是onCreate()
->onStartCommand()
。服务启动了之后会一直保持运行状态,直到stopService()
或stopSelf()
方法被调用,服务停止并回调onDestroy()
。另外,无论调用多少次startService()
方法,只需调用一次stopService()
或stopSelf()
方法,服务就会停止了。 -
Remote
方式
其它组件调用Context
的bindService()
可以绑定一个Service
,并回调服务中的onBind()
方法。类似地,如果该服务之前还没创建,那么回调的顺序是onCreate()
->onBind()
。之后,调用方可以获取到onBind()
方法里返回的IBinder
对象的实例,从而实现和服务进行通信。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态,直到调用了unbindService()
方法服务会停止,回调顺序onUnBind()
->onDestroy()
。
这里需要注意的是,本地启动的方式试运行activity的主线程上的,但是远程启动方式,启动的是在独立的进程主线程上这个要注意,他是可以独立于app进程,即使app关闭,这个线程也可以独立维护,比如微信的聊天监控服务和jpush等推送服务都是属于远程服务。
3 ActivityManagerService
的作用
ActivityManagerService
是Android
中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似,详见ActivityManagerService分析。
4 如何保证Service
不被杀死
根据收集到的效果比较好的有下面几个方法:
- 在
Service
的onStartCommand()
中设置flages
值为START_STICKY
,使得Service被杀死后尝试再次启动Service
- 提升
Service
优先级,比如设置为一个前台服务 - 在
Activity
的onDestroy()
通过发送广播,并在广播接收器的onReceive()
中启动Service
.
5 IPC是什么以及存在的价值
IPC,InterProcess Communication,指的是多进程通信,由于Android是从linux核,它的设计也类似由于每个app的进程之间是被隔离的,所以我们无法直接访问以及进行通信,我们这个时候就需要依靠其他办法来通信,具体的通信方式有:
- Message 通信,一般安卓四大组件之间
- 用文件共享 ---->用于单线程读写
- .AIDL ,主要用于调用远程服务的方法的情况 还可以注册接口。用法比较比以上两种复杂,但是能够传递复杂类型,可进行稳定传送。
- ContentProvider方式 实现对另一个应用进程开放provider数据的查询
另外多进程会导致以下几个问题
- 静态变量和单例模式失效:由独立的虚拟机造成
- 线程同步机制失效:由独立的虚拟机造成
- SharedPreference的不可靠下降:不支持两个进程同时进行读写操作,即不支持并发读写,有一定几率导致数据丢失
- Application多次创建: Android系统会为新的进程分配独立虚拟机,相当于系统又把这个应用重新启动了一次。
6 谈谈Binder
Binder,中文翻译粘合剂,它从应用层来说就是 ,服务端中的Service给与其绑定的客户端提供Binder对象,客户端通过AIDL接口中的asInterface()将这个Binder对象转换为代理Proxy,并通过它发起RPC请求。客户端发起请求时会挂起当前线程,并将参数写入data然后调用transact(),RPC请求会通过系统底层封装后由服务端的onTransact()处理,并将结果写入reply,最后返回调用结果并唤醒客户端线程。
网络图片(来自厘米姑娘博客)
网友评论