关于AIDL的使用---- Android 进程间通讯之一

关于AIDL的使用---- Android 进程间通讯之一

AIDL AndroidInterface Definition Language,Android接口定义语言

由于进程间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

其中AIDL是方法之一,一般都是配合service来进行跨进程通讯,单独AIDL无法通信。

 

关于AIDL的使用,一般分为serverclient端。

Server的实现步骤如下

1, server端生成一个以”.aidl”结尾的文件,定义接口,如下:



接口内容如下:

package com.example.server;

interface IRemoteService {
    int getPid();
   
}

 2, 编译完成后会在gen目录下生成一个同样目录的文件,文件名为IRemoteService.java, 如下:

 

3, 定义一个service TAService, 实现 IRemoteService里的接口

package com.example.server;

import com.example.server.IRemoteService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;
import android.util.Log;
 
public class TAService extends Service {
	private static String TAG = "AIDLServer";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG," onCreate........" + "Thread: " + Thread.currentThread().getName());
    }
    @Override
    public IBinder onBind(Intent arg0) {
    	Log.i(TAG,"DDService onBind");
        return mBinder;
    }
 
    private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
        public int getPid(){
        	Log.i(TAG,"Thread: " + Thread.currentThread().getName());
        	Log.i(TAG," getPid ");
            return Process.myPid();
        }
       
    };
 
}


4, 然后需要在server app 的AndroidManifest.xml 里面声明对应的service

      <service
            android:name="com.example.server.TAService"
            android:enabled="true"   
            android:exported="true"   >   
        </service>  

 

Client 端实现步骤如下:

 5, 定义一个和server端同一目录的aidl文件

文件内容必须和server端的 文件内容一模一样,包括参数名称

package com.example.server;

interface IRemoteService {
    int getPid();
   
}

6, 在对应调用TAService的activity中定义ServiceConnection,实现对应接口,代码如下:

 

ServiceConnection conn = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
         
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            remoteService = IRemoteService.Stub.asInterface(service);
            try {
                int pid = remoteService.getPid();
                int currentPid = Process.myPid();
                Log.i(TAG,"currentPID: " + currentPid +"  remotePID: " + pid);
            } catch (RemoteException e) {
                e.printStackTrace();
                Log.i(TAG,"RemoteException");
            }
            Log.i(TAG,"bind success! " + remoteService.toString());
        }
    };
    

7, 绑定Server端的TAService,代码如下:

			Intent intent = new Intent();
				ComponentName comp = new ComponentName("com.example.server",
						"com.example.server.TAService");

				intent.setComponent(comp);
				
		        bindService(intent, conn, Context.BIND_AUTO_CREATE);

 


完成上述步骤以后即可在conn 的回调中执行aidl接口

 执行client代码之前首先要执行server端apk,保证TAService已经跑起来,否则client端绑定失败, conn的两个回调函数都跑不起来。

 由此可见, AIDL支持跨进程间接口调用,不支持静态数据读取。

 

 

demo 代码下载地址如下:

http://download.csdn.net/detail/kuanxu/9572698

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值