Android Service(三)

本文介绍如何使用AIDL(Android Interface Definition Language)实现跨进程Service,并探讨了多线程并发访问的问题及解决方案。此外,还讨论了AIDL文件中只能使用基本数据类型的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        如果对service有多线程并发访问的需求,那就只能用AIDL来实现了,用android提供的自动生成工具,还是比较容易实现的。

//IServiceDemo.aidl

package com.example.servicedemo;

interface IServiceDemo {
	void sayHello();
}

我用的配置好的eclipse,编译的时候在gen目录下会自动帮生成IServiceDemo.java. 会看到里面多了Stub和Proxy,对进程间通信做了封装,这里就不多说了。使用aidl实现serivce的时候有一个特别注意的地方,在有进程bind上service的时候,会马上返回,但是aidl是没有做进程安全的,需要使用者自己来好保护。

/ServiceDemo.java

	IServiceDemo mBinder2 = null;
	ServiceConnection mConnectionAidl = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			try {
				mBinder2 = IServiceDemo.Stub.asInterface(service);
				mBinder2.sayHello();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
	};
	
	private void bindAidlService() {
		Intent service = new Intent(this, ServiceDemo.class);
		this.bindService(service, mConnectionAidl, Service.BIND_AUTO_CREATE);
	}
	
	private void unbindAidlService () {
		if(mConnectionAidl != null)
			this.unbindService(mConnectionAidl);
	}
}

这里有一个问题,aidl文件里只能用基本的数据类型,那我想传递或者返回一个封装好的类对象了该怎么办呢?且听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值