Android Service : Service注意的问题

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类似,也有以上的特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值