国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android IPC機制Messenger實例詳解

2019-10-22 18:32:11
字體:
來源:轉載
供稿:網友

Android IPC機制Messenger實例詳解

前言:

Messenger可以翻譯成信使,通過它可以在不同進程間傳遞Message對象有了它就可以輕松實現進程間的數據傳遞了。

Messenger使用的方法相對AIDL比較簡單,它對AIDL做了一層封裝是的我們不需要像采用AIDL那樣去實現進程通信那么麻煩,可以看看他的源碼有AIDL的跡象。

public final class Messenger implements Parcelable {  private final IMessenger mTarget;  public Messenger(Handler target) {    mTarget = target.getIMessenger();  }  public void send(Message message) throws RemoteException {    mTarget.send(message);  }  public IBinder getBinder() {    return mTarget.asBinder();  }  public boolean equals(Object otherObj) {    if (otherObj == null) {      return false;    }    try {      return mTarget.asBinder().equals(((Messenger)otherObj)          .mTarget.asBinder());    } catch (ClassCastException e) {    }    return false;  }  public int hashCode() {    return mTarget.asBinder().hashCode();  }  public int describeContents() {    return 0;  }  public void writeToParcel(Parcel out, int flags) {    out.writeStrongBinder(mTarget.asBinder());  }  public static final Parcelable.Creator<Messenger> CREATOR      = new Parcelable.Creator<Messenger>() {    public Messenger createFromParcel(Parcel in) {      IBinder target = in.readStrongBinder();      return target != null ? new Messenger(target) : null;    }    public Messenger[] newArray(int size) {      return new Messenger[size];    }  };  public static void writeMessengerOrNullToParcel(Messenger messenger,      Parcel out) {    out.writeStrongBinder(messenger != null ? messenger.mTarget.asBinder()        : null);  }  public static Messenger readMessengerOrNullFromParcel(Parcel in) {    IBinder b = in.readStrongBinder();    return b != null ? new Messenger(b) : null;  }  public Messenger(IBinder target) {    mTarget = IMessenger.Stub.asInterface(target);  }}

首先我們需要新建一個Service來處理客戶端的請求,同時聲明一個Handler作為參數來創建一個Messenger,然后通過getBinder()方法返回Binder。

public class MessageService extends Service {  private Messenger mMessenger = new Messenger(new Handler() {    @Override    public void handleMessage(Message msgFromClient) {      super.handleMessage(msgFromClient);      Message msgToTarget = Message.obtain(msgFromClient);      msgToTarget.what = 0;      try {        Thread.sleep(2000);        msgToTarget.arg1 = msgFromClient.arg1 + msgFromClient.arg2;        msgFromClient.replyTo.send(msgToTarget);      } catch (InterruptedException e) {        e.printStackTrace();      } catch (RemoteException e) {        e.printStackTrace();      }    }  });  @Nullable  @Override  public IBinder onBind(Intent intent) {    return mMessenger.getBinder();  }}

里面的邏輯是簡單的將客戶端傳來的Message中的arg1和arg2的值相加并將結果返回給Message對應的replyTo這個Messenger,并通過send將服務端的Message返回給客戶端。

然后在客戶端處理:首先需要bindService來綁定這個Service,然后通過IBinder生成一個Messenger對象,這個Messenger對象就可以將需要處理的數據封裝到Message然后send到Service去。

 Messenger mMessenger = new Messenger(new Handler() {    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);      Log.w("Jayuchou", "--- 從異步線程中讀取到數據 --- " + msg.arg1);    }  });  Messenger mService;  ServiceConnection connection = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {      mService = new Messenger(service);      Log.w("Jayuchou", "-- Connected success --");    }    @Override    public void onServiceDisconnected(ComponentName name) {      Log.w("Jayuchou", "-- Connected dismiss --");      mService = null;    }  };

然后調用的地方方式為:

     Message msgFromClient = Message.obtain(null, 0, 1, 2);        msgFromClient.replyTo = mMessenger;        try {          mService.send(msgFromClient);        } catch (RemoteException e) {          e.printStackTrace();        }

將數據封裝Message中,并且Message中的replyTo指定服務端中要將結果回調的Messenger對象。

msgFromClient.replyTo.send(msgToTarget);

我們可以看到Service中有這么一句代碼,其中的replyTo就是我們在客戶端傳進去的Messenger,這時候調用send方法就可以將服務端的也就是另一個進程的數據傳到想要用的進程然后采用Messenger進行接收,我們可以跟Handler用法類似的使用即可。Messenger是一個輕量級的AIDL,一次一個處理請求。

以上就是Android messenger 的消息處理的詳解,關于Android 開發的文章,本站還很多,請大家搜索參閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广东省| 谷城县| 东乡县| 健康| 永吉县| 华蓥市| 石首市| 河北区| 永泰县| 石屏县| 顺义区| 仪陇县| 洛隆县| 湄潭县| 金秀| 萨嘎县| 辛集市| 上饶县| 水富县| 玉林市| 临汾市| 汉川市| 汉中市| 玛纳斯县| 随州市| 左贡县| 个旧市| 大荔县| 自贡市| 湟中县| 巴林右旗| 蒙城县| 辽宁省| 财经| 隆林| 新沂市| 合川市| 清水县| 九台市| 咸宁市| 丹巴县|