Android开发之使用AIDL和远程服务实现进程通信

       在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递数据时,该如何实现呢? 在Android中, 采用AIDL(Android Interface Definition Language:接口定义语言)方式实现。

    AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。

//先来讲一下利用bindService调用服务里面的方法:
//DemoActivity:
public class DemoActivity extends Activity implements OnClickListener {
	private Button bt_bind_service;
	private Button bt_unbind_service;
	private Button bt_call_service;
	private Intent intent;
	private MyConn conn;
	private IService iService;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		bt_bind_service = (Button) this.findViewById(R.id.button3);
		bt_unbind_service = (Button) this.findViewById(R.id.button4);
		bt_call_service = (Button) this.findViewById(R.id.button5);
		bt_bind_service.setOnClickListener(this);
		bt_unbind_service.setOnClickListener(this);
		bt_call_service.setOnClickListener(this);
		intent = new Intent(this, MyService.class);
		conn = new MyConn();
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button3: // 绑定服务
			bindService(intent, conn, Context.BIND_AUTO_CREATE);
			break;
		case R.id.button4: // 解除绑定服务
			unbindService(conn);
			break;
		case R.id.button5: // 调用服务里面的方法
			iService.callMethodInService();
			break;
		}
	}
	private class MyConn implements ServiceConnection {
		//当服务绑定成功后,会调用这个方法。
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			iService=(IService) service;
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
		}
	}
	@Override
	protected void onDestroy() {
		unbindService(conn);
		super.onDestroy();
	}
}
//MyService:
public class MyService extends Service {
	@Override
	public IBinder onBind(Intent intent) {
		return new MyBinder();
	}
	
	public class MyBinder extends Binder implements IService{
		@Override
		public void callMethodInService() {
			sayHelloInService();
		}
	}
	public void sayHelloInService(){
		System.out.println("Hello in Service");
	}
}

//IService:
public interface IService {
	public void callMethodInService();
}

/*
步骤总结:
①创建一个服务,这个服务里面有一个要被调用的方法,sayHelloInService()
②定义一个接口IService,接口里面有一个抽象方法,这个抽象方法的作用
  就是去调用的sayHelloInService().
③在MyService中定义一个MyBinder类,继承Binder,实现IService,
  实现IService中的抽象方法。在onBind()方法中把MyBinder对象返回。
④在Activity中定义一个类MyConn实现ServiceConnection接口,并实现
  该接口中的onServiceConnected()方法,
  这个方法有一个参数IBinder service,也就是说,当Activity绑定服务成功时,
  会调用这个onServiceConnected()方法,该方法中的IBinder类型的参数,
  就是MyService中的onBind()方法返回的Binder对象,而这个Binder对象又实现
  了IService接口,所以在Activity中定义一个private IService iService..........
  然后把IBinder service赋给iService,强转成IService。
  
  注意:Binder是IBinder的子类。
⑤在Activity中通过bindService()开启服务
⑥绑定服务后就可以在Activity中通过iService.callMethodInService()调用Service里面的
  方法。
  */
  
  
//接下来讲AIDL
public class DemoActivity extends Activity {
	IService iService;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    	Intent intent = new Intent();
    	intent.setAction("cn.itcast.remoteservice");
    	bindService(intent, new MyConn(), BIND_AUTO_CREATE);
    }
    public void click(View view){
    	try {
    		// 调用了远程服务的方法 
			iService.callMethodInService();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
    }
    private class MyConn implements ServiceConnection{
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			iService = IService.Stub.asInterface(service);
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
    }
}
//RemoteService中:
public class RemoteService extends Service {
	@Override
	public IBinder onBind(Intent intent) {
		return new MyBinder();
	}
	private class MyBinder extends IService.Stub{
		@Override
		public void callMethodInService() throws RemoteException {
			sayHelloInService();
		}
	}
	/**
	 * 服务里面的一个方法 
	 */
	public void sayHelloInService(){
		System.out.println("hello in service");
	}
}

//IService中:
interface IService {
 void callMethodInService();
}

/*
步骤总结:
①创建一个服务,这个服务里面有一个要被调用的方法,sayHelloInService()
②定义一个接口IService,接口里面有一个抽象方法,这个抽象方法的作用
  就是去调用的sayHelloInService().
  关键:把接口中定义的访问权限如public都要删除掉。
  把IService.java文件的后缀名改为aidl
  
③在RemoteService中定义一个MyBinder类,继承IService.Stub,
  在onBind()方法中把MyBinder对象返回。
④在DemoActivity所在的工程中新建一个包,包名就是IService.aidl原来的包名
  然后把IService.aidl从其所在的工程拷贝到DemoActivity所在工程。
⑤在Activity中定义一个类MyConn实现ServiceConnection接口,并实现
  该接口中的onServiceConnected()方法,
  @Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			iService = IService.Stub.asInterface(service);
		}
  
⑥开启服务:
  Intent intent = new Intent();
    	intent.setAction("cn.itcast.remoteservice");
    	bindService(intent, new MyConn(), BIND_AUTO_CREATE);

⑦调用远程服务的方法:
  iService.callMethodInService();
  */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值