一、建立服務(wù)端

-
創(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)
新建一個servicepublic 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)證通過。