Android Service更多知识

本文详细介绍了Android Service中的死亡代理DeathRecipient,如何在服务端进程异常中断时通知客户端。此外,还讲解了RemoteCallbackList的使用,包括其优势和应用场景,以及在服务端数据更新时如何回调客户端。同时,文章涵盖了Service运行线程、Messenger和IntentService的使用,帮助开发者选择合适的服务类型。
摘要由CSDN通过智能技术生成

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接口

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值