Android进程通信之AIDL Demo

来源:互联网 发布:python中的join函数 编辑:程序博客网 时间:2024/06/03 16:55

AIDL文件

package com.test.aidltestservice;//包名,注意ADIL文件在工程中的存放位置要与包名一致// Declare any non-default types here with import statementsinterface IMyAidlInterface {//接口名    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    String myAidlTest();//提供进程间调用的方法}

注:服务端和客户端都需要该文件,并且文件名和存放路径必须相同

服务端

创建类继承Service

public class AIDLRemoteService extends Service {    public final String TAG = this.getClass().getSimpleName();   /*   * Service生命周期方法   */    @Override    public void onCreate() {        super.onCreate();        Log.i(TAG, "onCreate");    }    @Override    public void onDestroy() {        Log.i(TAG, "onDestroy");        super.onDestroy();    }   /*   * 创建AIDL服务Binder   */    private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){        @Override        public String myAidlTest() throws RemoteException {//ADIL文件中定义的方法名            return "Hello AIDL test";        }    };    /*    * Binder方法重载    */    @Override    public IBinder onBind(Intent intent) {        Log.i(TAG, "onBind");        return mBinder;    }    @Override    public boolean onUnbind(Intent intent) {        Log.i(TAG, "onUnbind");        return super.onUnbind(intent);    }}

服务端AndroidManiest.xml

 <service android:name="com.coship.aidltestservice.AIDLRemoteService">       <intent-filter>           <action android:name="aidltestservice.AIDLRemoteService"/>       </intent-filter></service>

注:action android:name 才是客户端绑定时初始化话Intent的名称,而不是service name

客户端

public class ClientMainActivity extends Activity{    public final String TAG = this.getClass().getSimpleName();    private IMyAidlInterface mConnectIMyAidlInterface;//通过该实例调用AIDL方法    private final static AIDL_INTENT_NAME= "aidltestservice.AIDLRemoteService";    @Override    protected void onCreate(Bundle savedInstanceState) {        Log.i(TAG,"onCreate");        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_client_main);        mContext = this;        bindAidlService();    }   @Override   protected void onResume() {        Log.i(TAG,"onResume");        try{            String string = mConnectIMyAidlInterface.myAidlTest();//调用AIDL接口,返回的是"Hello AIDL test"        }       catch (RemoteException e){           Log.w(TAG, "服务调用失败");        }   }    private void bindAidlService(){        Intent intent = new Intent(AIDL_INTENT_NAME);        boolean ret = bindService(intent, mConnection, Context.BIND_AUTO_CREATE);        Log.i(TAG, "创建AIDL链接是否成功:"+ret);    }    private ServiceConnection mConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder binder){            mConnectIMyAidlInterface = IMyAidlInterface.Stub.asInterface(binder);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            mConnectIMyAidlInterface = null;        }    };}

注意事项:
1、客户端与服务端都要包含同一套AIDL文件,并且路径相同;
2、服务端AndroidManiest.xml必须定义service和,否则绑定不成功;
3、客户端绑定Binder的名称为service的action android:name而不是AIDL的包名或者service name