AIDL调用指南

近期有需求要实现两个apk之间的通信,想到用AIDL来实现,现写一个demo学习下AIDL怎样使用。

这里我要实现一个apk(client端)调用还有一个apk(server端)的方法.

先实现server端。代码结构例如以下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3FpYW95ZWJvMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

AIDL文件内容例如以下:

package com.example.testaidl;
interface MyInterface {
    void testMethod();
}

MainActivity.java

package com.example.testaidlserver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startService(new Intent(this, MyService.class));
	}

}

MyService.java

package com.example.testaidlserver;

import com.example.testaidl.MyInterface;

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

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		Log.i("MyService", "service onBind....");
		return new ImplAIDLService();
	}

	private class ImplAIDLService extends MyInterface.Stub {

		@Override
		public void testMethod() throws RemoteException {
			Log.i("MyService", "testMode invoked");
		}
	}
}

Manifest中加入MyService的注冊

<service  android:name="com.example.testaidlserver.MyService">
     <intent-filter>
           <action android:name="com.example.testaidlserver.MyService"/>
           <category android:name="android.intent.category.DEFAULT"/>
     </intent-filter>
</service>

以下是Client端的

aidl文件和server端的要一样

package com.example.testaidl;
interface MyInterface {
    void testMethod();
}

MainAcitvity的功能是,绑定server端的service。调用server端的方法

package com.example.testaidlclient;

import com.example.testaidl.MyInterface;

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

public class MainActivity extends Activity implements OnClickListener {
	private boolean mIsBinded = false;
	private MyInterface mInterface;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btn_bind = (Button)findViewById(R.id.btn_bind);
		btn_bind.setOnClickListener(this);
		Button btn_invoke = (Button)findViewById(R.id.btn_invoke);
		btn_invoke.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch(v.getId()) {
		case R.id.btn_bind:
			if(mIsBinded) {
				unbindService(con);
			}else {
				bindService(new Intent("com.example.testaidlserver.MyService"), con, Context.BIND_AUTO_CREATE);
			}
			break;
		case R.id.btn_invoke:
			try {
				mInterface.testMethod();
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			break;
		}
	}

	ServiceConnection con = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mIsBinded = false;
			mInterface = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mIsBinded = true;
			mInterface = MyInterface.Stub.asInterface(service);
		}
	};

}

执行结果:

时间: 2024-10-12 18:34:45

AIDL调用指南的相关文章

安卓IPC之aidl使用(三)---System aidl调用

安卓IPC之aidl使用(三)-System aidl调用 安卓IPC之aidl使用(一)–aidl常见使用 安卓IPC之aidl使用(二)-aidl本地实现 AIDL的理解: Service中的IBinder 还记得我们在MyService中利用new IMyInterface.Stub()向上转型成了IBinder然后在onBind方法中返回的.那我们就看看IMyInterface.Stub吧: public static abstract class Stub extends androi

使用AIDL调用服务中的方法

AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: interface InterfaceAidl { void interfacePay(); } public class MyService extends Service { class MyBinder extends InterfaceAidl.Stub { @Override public void i

WebService 接口调用指南

客户端开发步骤(java): 本例展示如何在Eclipse 环境下使用Axis2创建WebService客户端. 一. 环境准备(如果你已具备Axis2开发环境,跳过本步骤) 1.  Axis2 API包 本例使用的Axis2版本是1.4,请到以下地址下载:http://apache.mirror.phpchina.com/ws/axis2/1_4/axis2-1.4.1-bin.zip下载后将压缩包解压缩到任意目录.如果你希望直接使用Axis2 API进行开发,可能会需要这个包. 2.  Ax

Android Studio实现Service AIDL

Android Studio实现Service AIDL [日期:2015-01-02] 来源:Linux社区  作者:teenyboy [字体:大 中 小] 今天要开发过程中要用到AIDL的调用,之前用的eclipse有大量教程,用起来很方便,现在刚换了Android studio,不可否认studio真的很强大,只是很多功能还需要摸索. AIDL(Android Interface Definition Language)是Android接口定义语言的意思,它可以用于让某个Service与多

Service服务AIDL进程通信详细总结

一.基础概念 (一)定义以及作用 AIDL,Android Interface Definition Language(安卓接口定义语言).这里使用的接口定义语言aidl里面的语言其实并非是java语言,是跟C语言相近的一种语言. 我们要知道的一点是ContentProvider内容提供者,给我们提供的是数据,而Service服务中的AIDL提供给我们的是方法,这就是这两种进程间通信的作用的区别. (二)创建AIDL服务步骤 建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: 1.在Ec

大仙说道之Android studio实现Service AIDL

今天要开发过程中要用到AIDL的调用,之前用的eclipse有大量教程,用起来很方便,现在刚换了Android studio,不可否认studio真的很强大,只是很多功能还需要摸索. AIDL(Android Interface Definition Language)是Android接口定义语言的意思,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能. 言归正传,今天的主题是远程Service建立AIDL进行通信,通过一

Android Interface Definition Language (AIDL)——翻译自developer.android.com

Android 接口定义语言(AIDL) AIDL类似你可能接触过的其他的IDL.它可以让你定义编程接口,使得客户端和服务端可以达成一致,从而使用IPC(interprocess communication)相互通信. 在Android里面,一个进程通常不能访问其他进程的内存.所以说,他们需要将对象分解为操作系统可以理解的基本的部分,从而使得这些对象为你突破界限.然而突破界限的代码太繁杂,所以Android使用AIDL替你打理. 提示:只有当你想要不同app的客户端都可以对你的service I

android开发步步为营之62:进程间通信之Aidl

android进程之间通信,比如一个app和另外一个app交互,有哪几种方式,主要有1.activity的跳转  2.contentprovider  3.broadcast  4.aidl,个人认为前面3种相对简单,应用场景也不一样.本文研究一下使用aidl进行进程之间的通信. aidl全称是Android Interface Definition Language,即接口定义语言,依我理解,这个其实和.net,java里面的webservice相似的,webservice也有个wsdl We

网站应用微信登录功能接口开发指南

准备工作 网站应用 微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程. 授权流程说明 微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭