Android进程通信之AIDL Demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cugwuhan2014/article/details/72772114

###AIDL文件

package com.test.aidltestservice;//包名,注意ADIL文件在工程中的存放位置要与包名一致
// Declare any non-default types here with import statements
interface 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

猜你喜欢

转载自blog.csdn.net/cugwuhan2014/article/details/72772114