进程通信aidl入门

最近需要使用到进程通信,琢磨了一下,大致到了入门级别吧偷笑,还是随便写点,当自己以后看的笔记吧。

这边给出一个例子,这个例子网上有,原文http://blog.csdn.net/macdroid/article/details/8448742

自己试着照做了一遍,大致明白了这个原理。

要实现进程间的通信,大致分两块:

 Server端:


  • 配置aidl文件,里面需要定义你的接口,以及方法,(例如IPerson.aidl,保存之后,Eclipse会自动在gen目录下生成IPerson.java文件)Aidl文件内容如下:
package com.example.aidl;  
interface IPerson {   
    void setValue(String name);  
    String getValue();   
} 

注:aidl文件的创建,new-->File--->直接FileName中输入IPerson.aidl
  • 在需要用到数据源(Person)的地方去继承IPerson.Stub,该类需要放到与aidl文件同一个包下
package com.example.aidl;

import android.os.RemoteException;

/**
 * 必须要和aidl文件放到一个包下
 * @author cxq
 *
 */
public class Person extends IPerson.Stub {

	private String name;

	@Override
	public void setValue(String name) throws RemoteException {
		android.util.Log.e("cxq", "赋值" + name);
		this.name = name;
	}

	@Override
	public String getValue() throws RemoteException {
		android.util.Log.e("cxq", "获取" + name);
		return name;
	}

}


  • 配置通信的Service,编写Service类+配置Manifest文件,
package com.example.aidlserver;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import com.example.aidl.IPerson.Stub;
import com.example.aidl.Person;

public class ServiceC extends Service{
	private Stub iPerson = new Person();    
    @Override    
    public IBinder onBind(Intent arg0) {    
        Log.i("service", "onBind...");    
        return iPerson;    
    } 
}

manifest文件的配置

<service android:name="com.example.aidlserver.ServiceC" >
            <intent-filter>
                <action android:name="forServiceAidl" >
                </action>
            </intent-filter>
        </service>

  • 本地(Server端)通过bindService进行通信的方法
private ServiceConnection conn = new ServiceConnection() {

		// 断开连接时调用
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
		}

		// 连接时调用
		@Override
		public void onServiceConnected(ComponentName arg0, IBinder binder) {
			iPerson = IPerson.Stub.asInterface(binder);
			if (iPerson != null) {
				try {
					iPerson.setValue("Service AIDL");
					Toast.makeText(ServerActivity.this, "赋值成功!",
							Toast.LENGTH_LONG).show();
				} catch (RemoteException e) {
					e.printStackTrace();
					Toast.makeText(ServerActivity.this, "赋值失败!",
							Toast.LENGTH_LONG).show();
				}
			}
		}
	};

开启Service

bindService(new Intent("forServiceAidl"), conn,
						Service.BIND_AUTO_CREATE);
关闭Service

unbindService(conn);


以上就是Server端的配置以及调用的方法,下面说一下在Client端的配置和调用方法:

Client端:

  • 配置aidl,这里需要注意:包名和文件要和Server端保持一致,可以直接从Server端复制过来
  • 通过bindService 进行通信
private ServiceConnection conn = new ServiceConnection() {
		private IPerson person;

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
		}

		// 因为有可能有多个应用同时进行RPC操作,所以同步该方法
		@Override
		public synchronized void onServiceConnected(ComponentName arg0,
				IBinder binder) {
			// 获得IPerson接口
			person = IPerson.Stub.asInterface(binder);
			if (person != null) {
				try {
					// RPC方法调用
					person.setValue("ss");
					String name = person.getValue();
					Toast.makeText(ClientActivity.this,
							"远程进程调用成功!值为 : " + name, Toast.LENGTH_LONG).show();
				} catch (RemoteException e) {
					e.printStackTrace();
					Toast.makeText(ClientActivity.this, "远程进程调用失败! ",
							Toast.LENGTH_LONG).show();
				}
			}
		}
	};

开启Service
bindService(new Intent("forServiceAidl"), conn,
						Service.BIND_AUTO_CREATE);

最后付上两个项目的下载链接
http://download.csdn.net/detail/cxq234843654/9229949































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值