一、基本類型
1、AIDL是什么
2、AIDL的使用

1.創建AIDL文件
在app項目創建aidl文件
輸入名稱后,as就幫我們創建了一個AIDL文件。

定義好之后,就可以sycn project一下,然后新建一個service。在service里面創建一個內部類,繼承你剛才創建的AIDL的名稱里的Stub類,並實現接口方法,在onBind返回內部類的實例。
import android.os.RemoteException; public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return new MyBinder(); } class MyBinder extends Person.Stub { @Override public String getName() throws RemoteException { return "456"; } } }
接下來,將我們的AIDL文件拷貝到第二個項目(aidlcalldemo),然后sycn project一下工程。
注意:這邊的包名要跟第一個項目的一樣哦,這之后在Activity中綁定服務。
package com.lyf.test.aidlcalldemo; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import android.widget.Toast; import com.lyf.test.aidldemo.Person; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.button) Button button; private Person person; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); Intent intent = new Intent(); intent.setComponent(new ComponentName("com.lyf.test.aidldemo", "com.lyf.test.aidldemo.MyService")); bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { person = Person.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }, BIND_AUTO_CREATE); } @OnClick(R.id.button) public void onViewClicked() { try { Toast.makeText(MainActivity.this, person.getName(), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } }
Android5.0之后只能使用顯式Intent啟動Service組件。
在onServiceConnected方法中通過Person.Stub.asInterface(service)獲取Person對象,然后在onClick中調用person.getName()。

二、自定義類型

實現Parcelable接口
接下新建一個aidl文件,名稱為我們自定義類型的名稱,這邊是User.aidl。

在User.aidl聲明我們的自定義類型和它的完整包名,注意這邊parcelable是小寫的,不是Parcelable接口,一個自定類型需要一個這樣同名的AIDL文件。
package com.lyf.test.aidldemo;
parcelable User;

然后定義接口方法,sycn project后就可以在service中做具體實現了。
package com.lyf.test.aidldemo; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return new MyBinder(); } class MyBinder extends IMyAidlInterface.Stub { @Override public String getName() throws RemoteException { return "456"; } @Override public User getUserName() throws RemoteException { return new User("789"); } } }
最后將我們的AIDL文件和自定義類型的java一並拷貝到第二個項目,注意包名都要一樣哦。
然后就可以在Activity中使用該自定義類型的AIDL接口了。
package com.lyf.test.aidlcalldemo; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import android.widget.Toast; import com.lyf.test.aidldemo.IMyAidlInterface; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.button) Button button; private IMyAidlInterface iMyAidlInterface; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); Intent intent = new Intent(); intent.setComponent(new ComponentName("com.lyf.test.aidldemo", "com.lyf.test.aidldemo.MyService")); bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }, BIND_AUTO_CREATE); } @OnClick(R.id.button) public void onViewClicked() { try { Toast.makeText(MainActivity.this, iMyAidlInterface.getUserName().getName(), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } }
大功告成。
github項目demo:https://github.com/First-Time/AIDLDemo.git