AIDL

一、建立服務(wù)端

新建.aidl.png
  • 創(chuàng)建完.aidl后

    basicTypes這個方法可以無視,看注解知道這個方法只是告訴你在AIDL中你可以使用的基本類型(int, long, boolean, float, double, String),因?yàn)檫@里是要跨進(jìn)程通訊的,所以不是隨便你自己定義的一個類型就可以在AIDL使用的

    我們在AIDL文件中定義一個我們要提供給第二個APP使用的接口。
    like:
    String getName();

  • sync project一下(tools>android>sync)
    新建一個service

      public class MyService extends Service {
    
          public MyService() {
          }
      
          @Nullable
          @Override
          public IBinder onBind(Intent intent) {
              return new myBind();
          }
      
          class myBind extends IMyAidlInterface.Stub {
      
              @Override
              public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
              }
      
              @Override
              public String getName() throws RemoteException {
                  return "test my aidl";
              }
          }
      }
    
  • 在androidmanifest配置


    <service android:name=".MyService">
    <intent-filter>
    <action android:name="com.dawn.myaidl.IMyAidlInterface"></action>
    </intent-filter>
    </service>

AIDL調(diào)用方代碼

  • 將我們的AIDL文件拷貝到第二個項(xiàng)目,然后sycn project一下工程。
    這邊的包名要跟第一個項(xiàng)目的一樣哦,這之后在Activity中綁定服務(wù)。

      public class MainActivity extends AppCompatActivity {
    
      IMyAidlInterface iMyAidlInterface;
      Button aidlBtn;
    
    
      private  ServiceConnection serviceConnection = new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
              iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);//獲取服務(wù)對象
    
      }
    
      @Override
      public void onServiceDisconnected(ComponentName componentName) {
    
      }
      };
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
    
    
      // 我們沒辦法在構(gòu)造Intent的時候就顯式聲明.
      Intent intent = new Intent("com.dawn.myaidl.IMyAidlInterface");
      // 既然沒有辦法構(gòu)建有效的component,那么給它設(shè)置一個包名也可以生效的
      intent.setPackage("com.dawn.myplugin");// the service package
    
      bindService(intent, serviceConnection, BIND_AUTO_CREATE);
      aidlBtn = (Button) findViewById(R.id.button);
      aidlBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              try {
                  Toast.makeText(MainActivity.this, iMyAidlInterface.getName(), Toast.LENGTH_SHORT).show();
              } catch (RemoteException e) {
                  e.printStackTrace();
              }   
          }
      });
      }
      }
    
  • Service隱式意圖啟動 不支持5.0及以上的系統(tǒng)

  • 不是不支持,只是要求在隱式啟動的時候帶上component或者packageName。ContextImpl源碼中validateServiceIntent方法對service安全性判斷是在component和packageName同時為空并且當(dāng)前SDK版本高于KITKAT的情況下才會拋出IllegalArgumentException異常。Google官方推薦的方式是在設(shè)置action的同時設(shè)置packageName,這樣就可以驗(yàn)證通過。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容