第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Android Service實(shí)現(xiàn)雙向通信(三)

標(biāo)簽:
Android

这是系列文章《与Service实现双向通信》的第三篇,也是完结篇。通过前两篇介绍,我们基本已经实现了Client到Service的调用了。但是Service怎么反过来调用到我们的Client端呢?

我们接着上篇的例子,我们希望能够实现,当有用户加入(join())或者离开(leave())的时候,能够通知客户端。

实现方法是,客户端注册一个回调到Service中,当Service有用户加入或者离开的时候,就调用此回调。因为普通的interface对象不能通过AIDL注册到Service中,我们需要定义一个AIDL接口,如下:

// IParticipateCallback.aidlpackage com.race604.servicelib;interface IParticipateCallback {  
    // 用户加入或者离开的回调    void onParticipate(String name, boolean joinOrLeave);}

同时,在IRemoteService.aidl中添加两个方法如下:

// IRemoteService.aidlpackage com.race604.servicelib;// 注意这里需要importimport com.race604.servicelib.IParticipateCallback;interface IRemoteService {  
    ...

    void registerParticipateCallback(IParticipateCallback cb);
    void unregisterParticipateCallback(IParticipateCallback cb);}

这里需要注意的是,需要import com.race604.servicelib.IParticipateCallback;

我们可以先设想一下,需要在Service的实现中,用一个List来保存注册进来的IParticipateCallback实例。你肯定很快就想到上一篇中说的问题,如果客户端意外退出的话,需要从List列表中删掉对应的实例。否则不仅浪费资源,而且在回调的时候,会出现DeadObjectException。当然,我们可以使用上一篇文章中的方法,传入一个IBinder对象,使用Link-To-Death回调。

幸运的是,这是一个典型的应用场景,Android SDK提供一个封装好的对象:RemoteCallbackList,帮我自动处理了Link-To-Death的问题,这就帮我们剩下了很多代码了。

下面来看我们的RemoteService的实现:

package com.race604.remoteservice;import ...public class RemoteService extends Service {  
    ...
    private RemoteCallbackList<IParticipateCallback> mCallbacks = new RemoteCallbackList<>();

    private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
        ...
        @Override        public void registerParticipateCallback(IParticipateCallback cb) throws RemoteException {
            mCallbacks.register(cb);
        }

        @Override        public void unregisterParticipateCallback(IParticipateCallback cb) throws RemoteException {
            mCallbacks.unregister(cb);
        }

        @Override        public void join(IBinder token, String name) throws RemoteException {
            ...
            // 通知client加入            notifyParticipate(client.mName, true);
        }

        @Override        public void leave(IBinder token) throws RemoteException {
            ...
            // 通知client离开            notifyParticipate(client.mName, false);
        }
    };}

我们在Service中用mCallbacks来保存回调列表,在注册和反注册IParticipateCallback回调的时候,只要调用mCallbacks.register(cb);mCallbacks.unregister(cb);即可。是不是非常容易?

然后我们来看怎么在用户加入或者退出的时候,怎么通知回调。上面的代码中,在join()leave()函数中分别都调用了notifyParticipate()函数,我们来看它的实现:

private void notifyParticipate(String name, boolean joinOrLeave) {  
    final int len = mCallbacks.beginBroadcast();
    for (int i = 0; i < len; i++) {
        try {
            // 通知回调            mCallbacks.getBroadcastItem(i).onParticipate(name, joinOrLeave);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    mCallbacks.finishBroadcast();}

这里我们也是使用一个循环,获取每个callback,然后调用onParticipate()。循环开始前,使用mCallbacks.beginBroadcast();,来准备开始通知Callbacks,此函数返回值是mCallbacks中回调对象个数。循环结束的时候,调用mCallbacks.finishBroadcast();来宣告完成。

另外,在Service销毁的时候,需要清除掉mCallbacks中的所有的对象,如下:

@Overridepublic void onDestroy() {  
    super.onDestroy();
    // 取消掉所有的回调    mCallbacks.kill();}

客户端使用IParticipateCallback的方法,只要实现IParticipateCallback.Stub即可,如下:

package com.race604.client;import ...  public class MainActivity extends ActionBarActivity {  
    ...
    private ArrayAdapter<String> mAdapter;
    private IParticipateCallback mParticipateCallback = new IParticipateCallback.Stub() {

        @Override        public void onParticipate(String name, boolean joinOrLeave) throws RemoteException {
            if (joinOrLeave) {
                mAdapter.add(name);
            } else {
                mAdapter.remove(name);
            }
        }
    };}

此时,如果有用户加入或者离开,客户端就能自动受到回调了。完整的代码请参考这个Commit

本系列文章的完整源代码托管在Github上,有需要的可以参考。

到这里,我们就实现了真正意义上的与Sevice实现双向通信。虽然写了三篇文章,但是其实也不是很复杂。本文只是涉及到Service的Binder应用。其实Binder机制是Android的精华之一,为了深入理解,可以学习一下其实现原理,可以参考大神罗升阳的《老罗的Android之旅》的系列博客,关于Binder,可以从这里开始看。

总结:

参考:

  1. Android Develops | RemoteMessengerServiceSample

原文链接:http://www.apkbus.com/blog-705730-61307.html

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消