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

首頁 > 系統 > Android > 正文

Android IPC機制Messenger實例詳解

2019-12-12 02:27:50
字體:
來源:轉載
供稿:網友

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 開發的文章,本站還很多,請大家搜索參閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 始兴县| 松溪县| 西充县| 盱眙县| 拉萨市| 青海省| 乡城县| 黔西县| 宣武区| 景宁| 沭阳县| 门源| 武清区| 乌鲁木齐市| 丰县| 武胜县| 锦州市| 桑日县| 军事| 白玉县| 昭通市| 四子王旗| 周至县| 眉山市| 龙江县| 台湾省| 桐乡市| 吴忠市| 饶河县| 石首市| 康保县| 马龙县| 乃东县| 马山县| 东平县| 屯门区| 株洲县| 介休市| 台北市| 平武县| 龙州县|