`

【原创】Android aidl实现两个apk之间远程调用Service

 
阅读更多
Aidl,android平台的IPC方式之一,基于系统的Ibinder机制。
网上大多数例子都是在一个apk下来测试调用service,现在我在两个project下面来调用。
一个是server project,一个是client project
首先我们建立的是server project,这里面要实现aidl文件和一个service,activity只是用来启动service的,当然,你也可以通过发广播的形式来启动service。
首先看IAidlService.aidl文件:
package com.ds.server;
interface IAidlService {  
    int getType(); 
}  


这样在eclipse里面自动编译的时候会在gen下面生成IAidlService.java文件(灯下我们的client project要用)。
然后新建一个service,这个service里面has a IAidlService的stub对象,service具体代码如下:
package com.ds.server;

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

public class AidlService extends Service {

	private IAidlService.Stub mBinder = new IAidlService.Stub() {

		@Override
		public int getType() throws RemoteException {
			// TODO Auto-generated method stub
			return 5;
		}
	};

	private void Log(String str) { 
		Log.d("AidlService", "------ " + str + "------");
	}

	@Override
	public void onCreate() {
		Log("service create");   
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Log("service start id=" + startId);
	}

	@Override
	public IBinder onBind(Intent t) {
		Log("service on bind");
		return mBinder;
	}

	@Override
	public void onDestroy() {
		Log("service on destroy");
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		Log("service on unbind");
		return super.onUnbind(intent);
	}

	public void onRebind(Intent intent) {
		Log("service on rebind");
		super.onRebind(intent);
	}

}

这里一定要实现onBind方法,并返回一个IAidlService.Stub对象。
再去AndroidManifest.xml注册这个service:
<service
            android:name=".AidlService"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.ds.server.IAidlService" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>


android:enabled="true"
android:process=":remote"这两个标签可有可无。
只要注册了这个service就行。
好了,到此,服务端已经完成。

-------------------华丽的分割线-----------------------------------------

下面我们开始client project。
client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。
(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。)。
好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:
package com.ds.client;

import com.ds.server.IAidlService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AidlClientActivity extends Activity {

	IAidlService iservice; 

	private ServiceConnection connection = new ServiceConnection() {

		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			// 从远程service中获得AIDL实例化对象
			iservice = IAidlService.Stub.asInterface(service);
			Log.i("Client","Bind Success:" + iservice);
		}  

		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			iservice = null;
			Log.i("Client","onServiceDisconnected");
		}
	};  
  
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {  
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		final TextView tv = (TextView) findViewById(R.id.tv);
		Button bt = (Button) findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {
			

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent service = new Intent(IAidlService.class.getName());
				bindService(service, connection, BIND_AUTO_CREATE);
				if (iservice != null) {  
					try {
						tv.setText("" + iservice.getType());
					} catch (RemoteException e) {
						e.printStackTrace();
					}
				}

			}

		});

	}
}


注意几点:
1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类
2,需要一个ServiceConnection对象
3,通过Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。

唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。
附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。

参考资料:http://www.cnblogs.com/TerryBlog/archive/2010/08/24/1807605.html
分享到:
评论

相关推荐

    android 3个APK见的AIDL 通信

    本话题将深入探讨如何利用AIDL实现三个APK之间的通信,特别是当B作为主程序,A远程调用B并为C提供接口以调用B的功能。 首先,我们需要理解AIDL的基本概念。AIDL本质上是一种接口定义语言,它允许开发者定义在两个...

    Android Aidl

    AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,交换数据,即使它们运行在不同的进程中。在“Aidldemo”中,我们可以看到一个服务端(AIDLServer)和客户端(AIDLClient)的示例,这是...

    两个APK间AIDL通信

    综上所述,"两个APK间AIDL通信"是Android开发中一种重要的进程间通信方式,它依赖于AIDL、Binder机制以及Service和Activity的协作。理解并熟练掌握这一技术,对于开发复杂的Android应用具有重要意义。

    android aidl demo

    本示例"android aidl demo"提供了两个APK,分别展示了服务(Services)和活动(Activities)如何通过AIDL进行交互。 首先,我们来理解AIDL的基本概念。AIDL类似于Java接口,但它的设计目标是处理跨进程通信。当你...

    android开发资料大全

    Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信之socket教程实例汇总 AsyncTask进度条加载网站数据到ListView 命令行开发、编译、打包...

    binderDemo.zip

    本示例"BinderDemo"通过"AIDL"(Android Interface Definition Language)展示了如何在`ipc_server`和`ipc_client`两个APK之间实现Binder通信,以基础的加法和减法运算为例。 首先,我们需要理解AIDL的基本概念。...

    android sdk tools(内含traceView)

    下面我们将详细探讨这两个工具以及其他可能包含在SDK Tools中的组件。 1. **TraceView**: TraceView是Android SDK中的一个图形化视图,用于分析Java代码的执行性能。它能够显示应用程序中每个方法的调用时间,帮助...

    android ApkPlug使用

    通过这两个核心组件,ApkPlug实现了插件与主应用的无缝集成。 1. **ApkPlug的安装与配置** 在使用ApkPlug之前,你需要将其库文件添加到你的项目中。这通常通过在Gradle构建脚本中引入依赖来完成。添加依赖后,按照...

    精通ANDROID 3(中文版)1/2

    14.5.6 从两个位置控制唤醒锁  14.5.7 长期运行的服务的实现  14.5.8 测试长期运行的服务  14.6 代码编译说明  14.6.1 从ZIP文件创建项目  14.6.2 通过代码清单创建项目  14.7 参考资料  14.8 小结 ...

    2012最新java面试大全--很有帮助的

    Android支持多种IPC机制,包括AIDL、Binder、Socket等,用于实现不同进程间的数据交换和功能调用。 ### 61. 如何理解MVC模式及其在Android中的应用? MVC(Model-View-Controller)是一种软件架构模式,用于分离...

    Android面试系列—目录

    - 使用AIDL(Android Interface Definition Language)定义接口,实现不同进程间的通信。 - 使用`Messenger`和`Binder`机制实现进程间的数据交换。 #### 15. 子线程更新主线程控件可能出现的异常 - **异常**:`...

    精通Android 3 (中文版)2/2

    14.5.6 从两个位置控制唤醒锁  14.5.7 长期运行的服务的实现  14.5.8 测试长期运行的服务  14.6 代码编译说明  14.6.1 从ZIP文件创建项目  14.6.2 通过代码清单创建项目  14.7 参考资料  14.8 小结 ...

Global site tag (gtag.js) - Google Analytics