<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發(fā)

      導航

      直接通過Binder的onTransact完成跨進程通信

      1.具體代碼:

      服務端實現(xiàn):

      public class IPCService extends Service {
       
          private static final String DESCRIPTOR = "IPCService";
          private final String[] names = { "B神", "艸神", "基神", "J神", "翔神" };
          private MyBinder mBinder = new MyBinder();
       
          private class MyBinder extends Binder {
              @Override
              protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
                  switch (code) {
                  case 0x001: {
                      data.enforceInterface(DESCRIPTOR);
                      int num = data.readInt();
                      reply.writeNoException();
                      reply.writeString(names[num]);
                      return true;
                  }
                  }
                  return super.onTransact(code, data, reply, flags);
              }
          }
       
          @Override
          public IBinder onBind(Intent intent) {
              return mBinder;
          }
      }
      

      可以看到onTransact有四個參數(shù) 
      code , data ,replay , flags

      • code 是一個整形的唯一標識,用于區(qū)分執(zhí)行哪個方法,客戶端會傳遞此參數(shù),告訴服務端執(zhí)行哪個方法;
      • data客戶端傳遞過來的參數(shù);
      • replay服務器返回回去的值;
      • flags標明是否有返回值,0為有(雙向),1為沒有(單向)。

      客戶端實現(xiàn):

      public class MainActivity extends AppCompatActivity implements View.OnClickListener {
       
          private EditText edit_num;
          private Button btn_query;
          private TextView txt_result;
          private IBinder mIBinder;
          private ServiceConnection PersonConnection = new ServiceConnection() {
              @Override
              public void onServiceDisconnected(ComponentName name) {
                  mIBinder = null;
              }
       
              @Override
              public void onServiceConnected(ComponentName name, IBinder service) {
                  mIBinder = service;
              }
          };
       
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              bindViews();
       
              // 綁定遠程Service
              Intent service = new Intent("android.intent.action.IPCService");
              service.setPackage("com.jay.ipcserver");
              bindService(service, PersonConnection, BIND_AUTO_CREATE);
              btn_query.setOnClickListener(this);
          }
       
          private void bindViews() {
              edit_num = (EditText) findViewById(R.id.edit_num);
              btn_query = (Button) findViewById(R.id.btn_query);
              txt_result = (TextView) findViewById(R.id.txt_result);
          }
       
          @Override
          public void onClick(View v) {
              int num = Integer.parseInt(edit_num.getText().toString());
              if (mIBinder == null) {
                  Toast.makeText(this, "未連接服務端或服務端被異常殺死", Toast.LENGTH_SHORT).show();
              } else {
                  android.os.Parcel _data = android.os.Parcel.obtain();
                  android.os.Parcel _reply = android.os.Parcel.obtain();
                  String _result = null;
                  try {
                      _data.writeInterfaceToken("IPCService");
                      _data.writeInt(num);
                      mIBinder.transact(0x001, _data, _reply, 0);
                      _reply.readException();
                      _result = _reply.readString();
                      txt_result.setText(_result);
                      edit_num.setText("");
                  } catch (RemoteException e) {
                      e.printStackTrace();
                  } finally {
                      _reply.recycle();
                      _data.recycle();
                  }
              }
          }
      }
      

      2.transact和onTransact的區(qū)別

      談transact 和onTransact需要先聊聊iBinder

      IBinder是什么呢?首先要明白,Android的遠程調(diào)用(就是跨進程調(diào)用)就是通過IBinder實現(xiàn)的,下面是對android開發(fā)文檔的翻譯。

        IBinder是遠程對象的基本接口,是為高性能而設(shè)計的輕量級遠程調(diào)用機制的核心部分。但它不僅用于遠程調(diào)用,也用于進程內(nèi)調(diào)用。這個接口定義了與遠程對象交互的協(xié)議。不要直接實現(xiàn)這個接口,而應該從Binder派生。

        IBinder的主要API是transact(),與它對應另一方法是Binder.onTransact()。第一個方法使你可以向遠端的IBinder對象發(fā)送發(fā)出調(diào)用,第二個方法使你自己的遠程對象能夠響應接收到的調(diào)用。IBinder的API都是同步執(zhí)行的,比如transact()直到對方的Binder.onTransact()方法調(diào)用完成后才返回。調(diào)用發(fā)生在進程內(nèi)時無疑是這樣的,而在進程間時,在IPC的幫助下,也是同樣的效果。
        通過transact()發(fā)送的數(shù)據(jù)是Parcel,Parcel是一種一般的緩沖區(qū),除了有數(shù)據(jù)外還帶有一些描述它內(nèi)容的元數(shù)據(jù)。元數(shù)據(jù)用于管理IBinder對象的引用,這樣就能在緩沖區(qū)從一個進程移動到另一個進程時保存這些引用。這樣就保證了當一個IBinder被寫入到Parcel并發(fā)送到另一個進程中,如果另一個進程把同一個IBinder的引用回發(fā)到原來的進程,那么這個原來的進程就能接收到發(fā)出的那個IBinder的引用。這種機制使IBinder和Binder像唯一標志符那樣在進程間管理。
        系統(tǒng)為每個進程維護一個存放交互線程的線程池。這些交互線程用于派送所有從另外進程發(fā)來的IPC調(diào)用。例如:當一個IPC從進程A發(fā)到進程B,A中那個發(fā)出調(diào)用的線程(這個應該不在線程池中)就阻塞在transact()中了。進程B中的交互線程池中的一個線程接收了這個調(diào)用,它調(diào)用Binder.onTransact(),完成后用一個Parcel來做為結(jié)果返回。然后進程A中的那個等待的線程在收到返回的Parcel后得以繼續(xù)執(zhí)行。實際上,另一個進程看起來就像是當前進程的一個線程,但不是當前進程創(chuàng)建的。
        Binder機制還支持進程間的遞歸調(diào)用。例如,進程A執(zhí)行自己的IBinder的transact()調(diào)用進程B的Binder,而進程B在其Binder.onTransact()中又用transact()向進程A發(fā)起調(diào)用,那么進程A在等待它發(fā)出的調(diào)用返回的同時,還會用Binder.onTransact()響應進程B的transact()??傊瓸inder造成的結(jié)果就是讓我們感覺到跨進程的調(diào)用與進程內(nèi)的調(diào)用沒什么區(qū)別。
        當操作遠程對象時,你經(jīng)常需要查看它們是否有效,有三種方法可以使用:
        1 transact()方法將在IBinder所在的進程不存在時拋出RemoteException異常。
        2 如果目標進程不存在,那么調(diào)用pingBinder()時返回false。
        3 可以用linkToDeath()方法向IBinder注冊一個IBinder.DeathRecipient,在IBinder代表的進程退出時被調(diào)用。
        要實現(xiàn)IBinder來支持遠程調(diào)用,應從Binder類派生一個類。Binder實現(xiàn)了IBinder接口。但是一般不需要直接實現(xiàn)此類,而是跟據(jù)你的需要由開發(fā)包中的工具生成,這個工具叫AIDL。你通過AIDL語言定義遠程對象的方法,然后用AIDL工具生成Binder的派生類,然后就可使用之。然而,可是,但是,當然,你也可以直接從Binder類派生以實現(xiàn)自定義的RPC調(diào)用,或只是實例化一個原始的Binder對象直接作為進程間共享的令牌來使用。

        

        

      posted on 2018-07-04 16:22  安卓筆記俠  閱讀(3589)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲精品成人A在线观看| 亚洲熟妇中文字幕五十路| 久久精品国产亚洲av麻豆长发| 精品精品亚洲高清a毛片| 性XXXX视频播放免费直播| 国产一区二区在线激情往| 亚洲av无码专区在线厂| 日韩中文字幕高清有码| 视频一区二区三区自拍偷拍| 国产乱码1卡二卡3卡四卡5| 成人av片无码免费网站| 无码av中文字幕久久专区| 久久免费偷拍视频有没有| 无套内谢少妇毛片aaaa片免费| 国产尤物精品自在拍视频首页 | 鲁丝一区二区三区免费| 欧洲lv尺码大精品久久久| 亚洲精品国产第一区二区| 欧洲亚洲精品免费二区| 精品国产午夜福利在线观看| 国产精品夫妇激情啪发布| 国产高清在线男人的天堂| 台州市| 日本亚洲欧洲免费无线码| 精品人妻中文字幕在线| 怀远县| 日本夜爽爽一区二区三区| 不卡高清AV手机在线观看| 亚洲夂夂婷婷色拍ww47| 久久这里都是精品一区| 国产精品女同一区三区五区| 久久亚洲精品无码播放| 亚洲av无码牛牛影视在线二区| 国产永久免费高清在线| 榕江县| 麻豆a级片| 黑人巨大videos极度另类| 久久精品一本到99热免费| 色爱av综合网国产精品| 国产精品美女黑丝流水| 思思99热精品在线|