- 《Android Service基础》
- 《Android Service回调和配置》
- 《Android Service aidl使用及进阶》
- 《Android Service更多知识》
- 《Android 中的 IntentService 类详解》
- 《Android Service aidl分析》
- 《Android Service 流程分析》
这篇文章主要介绍的是一些Service的相关知识,绑定服务中服务器异常中断时处理办法(死亡代理 DeathRecipient)、服务器数据更新后实时通知客户端(回调通知以及RemoteCallbackList)、Service运行线程说明、使用 Messenger 实现 Servie 与 Client 端通信、可以执行耗时操作的Service(IntentService)、怎样选择什么类型的Service
死亡代理 DeathRecipient
在前面的几篇文章中,我么知道了服务的绑定、aidl的使用等,我们可以通过 bindService()
连接服务然后调用服务器的方法。但是在进行进程间通信的过程中,如果服务端进程由于某种原因异常终止,我们的远程调用就会失败,从而影响我们客户端的功能,那么有什么办法能够知道服务端进程是否终止了呢?在Android Service中,可以通过给IBinder增加死亡代理的方式,在服务端进程异常中断时,给客户端一个回调通知。具体的方式就是在 ServiceConnection
对象的回调方法 onServiceConnected
(该方法是客户端与服务端连接成功的回调)中调用IBinder的 linkToDeath(DeathRecipient recipient, int flags)
方法,传递 DeathRecipient
的对象,在服务器异常中断时,会回调该对象的 binderDied()
方法,可以在方法内部进行处理,如重新绑定等。
private IBinderPoolBinder iBinderPoolBinder;
private ServiceConnection bindConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iBinderPoolBinder = IBinderPoolBinder.Stub.asInterface(service);
// 增加死亡代理
try {
service.linkToDeath(recipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
// 死亡代理
private IBinder.DeathRecipient recipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
// 当服务器异常中断时,会调用该方法,可以在该方法内部进行处理,如重新绑定等
if (iBinderPoolBinder == null) return;
// 解除死亡通知,如果Binder死亡了,不会在触发binderDied方法
iBinderPoolBinder.asBinder().unlinkToDeath(recipient, 0);
iBinderPoolBinder = null;
bindService();
}
};
回调通知以及RemoteCallbackList
在前面我们已经知道了aidl的使用,远程服务aidl中的方法是运行在新的线程当中的,是可以执行耗时任务的,当客户端需要服务器执行耗时操作完成之后的结果时,那怎么办了?如果是在同一进程的不同线程中,子线程执行完耗时操作通知主线程,我们可以直接通过设置监听的方式就可以实现了。但是使用aidl时不是同一个进程了,我们是不是也可以使用监听的方式来获取结果了。答案是可以的,只是我们的监听对象不是普通的java接口