在app項目建立aidl文件java
輸入名稱後,as就幫咱們建立了一個AIDL文件。android
定義好以後,就能夠sycn project一下,而後新建一個service。在service裏面建立一個內部類,繼承你剛纔建立的AIDL的名稱裏的Stub類,並實現接口方法,在onBind返回內部類的實例。git
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一下工程。github
注意:這邊的包名要跟第一個項目的同樣哦,這以後在Activity中綁定服務。app
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組件。ide
在onServiceConnected方法中經過Person.Stub.asInterface(service)獲取Person對象,而後在onClick中調用person.getName()。ui
實現Parcelable接口this
接下新建一個aidl文件,名稱爲咱們自定義類型的名稱,這邊是User.aidl。spa
在User.aidl聲明咱們的自定義類型和它的完整包名,注意這邊parcelable是小寫的,不是Parcelable接口,一個自定類型須要一個這樣同名的AIDL文件。code
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