Android Service : Service注意的问题
AIDL传递自定义类型
AIDL在传递实现Parcelable接口的对象的时候,是属于值传递的。
原因是,AIDL在传递对象的时候,是通过在一端将数据写入Parcel,然后在另一端将Parcel中的数据读出,形成新的对象。所以从Parcel的机制上就决定了,AIDL传递对象是值传递。
因此,通过AIDL传递的对象,在一端更改了对象的属性,在另一端是无法看到的。
Binder通信是同步还是异步
Binder通信是同步的,一定要注意。
DeadObjectException处理
DeadObjectException是RemoteException的子类。
DeadObjectException一般出现在Servcie、Client通信中。
DeadObjectException的出现主要有如下两种情况:
1.在Client端用到Service的Object,而这时Service和Client的连接已经断开(Service进程终止或者其他情况造成连接断开)。这种情况需要重新bindService
2.在Service端用到Client的Object,而这时Client端的Object已经不存在了。这种情况,需要当Client端发现Object失去的时候,主动通知Service端Object已经不存在,Service端处理Object不存在的情况。
这种情况一个典型的情况是: Client端某个Activity向Service端注册callback,Service端保留callback,通过callback向Client通信。这时,如果Activity退出,但是没有主动通知Service,那么这时Service在调用callback的时候就会抛出DeadObjectException。这种情况下,Activity在退出的时候应该主动通知Service,callback已经失效,然后Service将callback移除。
判断Service有没有被绑定
给Service加个极速器bindCount,用来监测Service被bind的状态。当onBind的时候,bindCount++;当unBind的时候,bindCount–。当bindCount = 0的时候,说明Service没有被绑定。
stopSelf
stopSelf被调用后,不会马上执行,而是在当前函数执行完之后,才会有可能执行。具体的执行时间是由系统决定的。如果Service被绑定,则所有的Bind释放后,stopSelf才会起作用。
另外,stopSelf被执行之后,会调用onDestroy函数。
此外,Activity的finish函数和stopSelf类似,也有以上的特性。