toc | comments | description | title | tags | id | categories | date | ||
---|---|---|---|---|---|---|---|---|---|
true |
true |
Android高级笔记 |
Android高级笔记 |
|
8 |
|
2016-05-19 |
在 ViewRoot 还没有被创建的时候,是可以在子线程中直接更新 UI。
- ViewRoot 在 onCreat 时没有创建
- ViewRoot 在 onResume 后才创建
- UI 线程是没有加锁的,在非 UI 线程更新 UI 时候是不安全的操作,所以 Android 不让在子线程中直接更新 UI。
IPC: 进程之间的通信,Binder 是 Android 底层的进程间通信方式
- 在清单配置文件中通过应用 process 来指定进程 “:”说明是私有的进程(数据不共享)
- Binder 通过 Parcel 序列化来传递数据
- 简单的数据可以通过 Bundle 来或文件方式传递,但文件传递不及时,不安全。(解决:将文件的读写工作全部放到同一个进程中)
- 同进程:返回 Stub (正常的方法调用)
- 不同进程:返回 BinderProxy
- 创建 AIDL 必须继承 IInterface,IInterface 负责判断是否是同一个进程,是同一个进程返回真实对象,不是同一个进程返回 Binder 代理对象。
- 创建一个 Class 继承 IBinder 并实现 AIDL 接口。
- 有的异常 能 通过 Binder 进行跨进程返回,如 NullPointerException
- 有的异常 不能 通过 Binder 进行跨进程返回,如 RuntimeException
- 在服务端的异常不会导致服务端所在的进程挂掉
- 如果客户端收到异常,则客户端所在的进程会挂掉
- 绑定 Service
- 通过 new Messenger(IBinder) 来构造一个 Messenger 对象
- 通过 Message.obtain(Hander,flag)
- Bundle 装数据,Message 装 Bundle
- Messenger 对象发送 Message
处理服务端返回的消息: