文档章节

[Android]用AIDL生成Service

亭子happy
 亭子happy
发布于 2012/09/24 17:19
字数 821
阅读 1146
收藏 3

    对于用aidl生成Service,以前做过,这里记录一下,顺便也整理一下思路。

    1、创建aidl文件。

    这个aidl文件必须包括包名,和用interface的形式定义方法。

    例如:IAIDLService.aidl。

package com.ting.androidexample.services;

interface IAIDLExampleService {
	void show();
	void function(String packageName, IBinder binder);
}

     因为我是在eclipse中开发,所以这时会在gen目录下自动生成IAIDLExampleService.java文件。

    

    2、创建AIDLService.java文件。

    这个文件是一个Service,因此要继承Service类,因为Service是抽象类,因此,要实现抽象的onBind方法。onBind方法的返回值是一个Binder,这个Binder是要传给客户端的。这个Binder要继承自由aidl文件自动生成的IAIDLService.java类中的抽象子类Stub。而这个抽象子类中未实现的方法就是我们在IAIDLService.aidl中定义的方法。

public class AIDLService extends Service {
	
	private final IAIDLService.Stub mBinder = new IAIDLService.Stub() {

		@Override
		public void show() throws RemoteException {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void function(String packageName, IBinder binder)
				throws RemoteException {
			// TODO Auto-generated method stub
			
		}
		
	};

	@Override
	public IBinder onBind(Intent arg0) {
		return mBinder;
	}
		
}

    对于mBinder中的方法会传给绑定它的组件,然后绑定它的组件会调用这些方法。

    3、创建与AIDLService通信的类,比如,我们先用Activity去调用与该Service通信。

public class AIDLActivity extends Activity {
	
	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Intent intent = new Intent();
		bindService(intent, conn, Context.BIND_AUTO_CREATE);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(conn);
	}	
}

    只有执行bindService和unbindService时才会用到AIDL这种方式。

    在执行bindService时,它的第二个参数是一个ServiceConnection实例,这个实例有两个回调方法,onServiceConnected是服务连接上的回调,onServiceDisconnected是服务断开连接的回调。所以说,bindService在连接时是异步的。对于onServiceConnected的第二个参数就是Service返回给Activity的binder。也就是靠它来通信的。Activity可以通过这个binder调用传过来的方法。

    那么AIDLActivity如何使用这个传过来的Binder呢?我们看下面的代码。

private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			 mIAIDLService = IAIDLService.Stub.asInterface(service);
			 mIAIDLService.show();
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mIAIDLService = null;
		}
		
	};

    Activity的ServiceConnection中的代码可以修改为上面这样。首先得到mIAIDLService实例,然后就可以用mIAIDLService来执行aidl文件中定义的方法。这里需要注意,aidl文件中定义的方法可以是Binder,比如IAIDLService.aidl中的function方法的第二个参数就是Binder。对于Activity来说,它没有办法获得这个Binder传到参数中。

    如果绑定AIDLService的是一个Service,我们定义为ClientService的话,并且这个 ClientService 有一些方法需要传给AIDLService,那么就可以为这个 ClientService创建IClientService.aidl文件,并且把需要的方法定义在aidl文件中。这样,在ClientService中就可以实例化一个它自己的Binder,并且可以通过上面IAIDLService的function方法把这个Binder传入。

    例如:

public class ClientService extends Service {
	
	private IAIDLService mIAIDLService;
	
	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			 mIAIDLService = IAIDLService.Stub.asInterface(service);
			 try {
				mIAIDLService.show();
				mIAIDLService.function(getPackageName(), mBinder);
			} catch (RemoteException e) {
				e.printStackTrace();
			}		 
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mIAIDLService = null;
		}
		
	};
	
	private final IClientService.Stub mBinder = new IClientService.Stub() {
		
		@Override
		public void test() throws RemoteException {
			// TODO Auto-generated method stub
			
		}
	};
		
	@Override
	public void onCreate() {
		super.onCreate();
		Intent intent = new Intent();
		bindService(intent, conn, Context.BIND_AUTO_CREATE);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		unbindService(conn);
	}	

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

}

    IClientService.aidl文件为:

package com.ting.androidexample.services;

interface IClientService {
	void test();
}

© 著作权归作者所有

亭子happy
粉丝 120
博文 238
码字总数 46521
作品 0
海淀
程序员
私信 提问
android基础知识05:四大组件之service 02:远程调用

本文主要介绍service相关内容。包括两篇文章: android基础知识05:四大组件之service 01 android基础知识05:四大组件之service 02:远程调用 android基础知识05:四大组件之service 03:实...

迷途d书童
2012/03/23
356
0
Android通过Aidl调用Service实例

最近在上Android课程,现在我懒得备课了,直接拿博客来讲好了! Aidl访问Service实例: Android中Activity与Service是属于两个不同的进程的,而两个进程之间的通讯除了可以用广播之外,最完美...

MingliC
2013/12/23
422
0
Android AIDL 远程服务器使用示例

很多网友来函表示对Android AIDL不是很理解,这里Android123准备了一个简单的例子,帮助大家了解Android上比较强大的远程服务设计吧。 一、为什么要使用AIDL,他的优势有哪些呢? AIDL服务更像...

阿酷
2011/10/21
1K
0
简单音乐播放实例的实现,Android Service AIDL 远程调用服务

Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成。 AIDL 是什么 AIDL (Android Inte...

baisou
2013/07/27
1K
0
Android Service 服务(三)—— bindService与remoteService

一、bindService简介 bindService是绑定Service服务,执行service服务中的逻辑流程。 service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.s...

长平狐
2013/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0
JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
5
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
7
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部