AIDL实现Android进程间通信实例

实现Android进程间通信实例有好几种方法:

1,AIDL

2,Broadcast

3,Intent

4,Content Provider

记录一下AIDL实现Android进程间通信的方式:

Android的AIDL进程间通信实现步骤:

一:创建AIDL服务端:aidl文件,自动生成的接口java文件,服务service

xxxInterface.aidl  (远程服务的接口定义)

package com.example.aidltest;
interface  IMyAidlInterface
{
    String getValue();  //  为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法
}

1,创建一个xxxInterface.aidl文件,文件中是一个接口的形式

2,Eclipse自动完成,根据你的xxxInterface.aidl文件,在gen内生成一个xxxInterface.java文件,真正的创建了xxxInterface中的接口,并创建内部类Stub( extends android.os.Binder)

AIDLtestService.java      (远程服务的具体接口方法实现)

package com.example.aidltest;

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

public class AIDLtestService extends Service {

	//Two choices:
	//1:内部类实现,创建一个内部类继承自IMyAidlTest.Stub(自动生成的一个IMyAidlTest内部类)
	//2:匿名类实现,创建一个IMyAidlTest.Stub对象,实现接口方法String getValue()

	//1,内部类
	private MyAIDLimp aidlImp=new MyAIDLimp();
	public class MyAIDLimp extends  IMyAidlInterface.Stub
	{

		@Override
		public String getValue() throws RemoteException {
			// TODO Auto-generated method stub
			return "Hello World!";
		}

	}
	//2,匿名类
	private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){
		public String getValue() throws RemoteException {
			return "Hello Zero!";

		};
	};

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		//返回这个实现了getValue方法的IMyAidlTest.Stub
		//return mBinder
		return aidlImp;
	}

}

3,创建AIDL服务 (AIDLtestService  extends Service)

4,在serveice中创建一个xxxInterface.Stub的对象,可以通过内部类或者匿名类实现。这个对象要实现所有具体的接口方法

5,在onbind()中
return 4中创建的xxxInterface.Stub的对象

AndroidManifest.xml

        <service android:name="AIDLtestService">
            <intent-filter>
                <action android:name="com.example.aidltest.AIDLtestService" />
            </intent-filter>
        </service>

6,声明这个service,添加intent-filter中的action

二:客户端调用服务

远程的XXXActivity.java

</pre><p><pre name="code" class="java">package com.example.aidltest;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
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.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity {
	private Button btn ;
	private TextView tv;

	//创建IMyAidlInterface对象
	private IMyAidlInterface myAidlInterface=null;
	//创建ServiceConnection对象
	private ServiceConnection sc=new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			myAidlInterface = IMyAidlInterface.Stub.asInterface(arg1);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn=(Button)findViewById(R.id.button1);
		tv=(TextView)findViewById(R.id.textView1);

		//创建一个服务的intent,启动服务
		Intent intent = new Intent(this,AIDLtestService.class);
		bindService(intent, sc,Context.BIND_AUTO_CREATE);

		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				try {

					//通过IMyAidlInterface的对象调用远程服务
					String s= myAidlInterface.getValue();
					System.out.println(s);
					tv.setText(s);
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}

}

1,创建xxxInterface对象myInterface,创建ServiceConnection对象sc,在sc的onServiceConnected方法中实例化xxxInterface对象。

sc是在之后bindService中使用。

myInterface是之后调用服务进程的对象。

2,创建一个服务的Intent,用这个Intent启动远程服务器的service---AIDLtestService

3,bindService(intent, sc,Context.BIND_AUTO_CREATE);

4,通过myInterface调用远程服务。

时间: 2024-11-06 20:23:21

AIDL实现Android进程间通信实例的相关文章

AIDL Service Android进程间通信机制

转载出处:http://www.apkbus.com/home.php?mod=space&do=blog&uid=664680&id=59465 我们知道,在Android app中的众多activity,service等组件可以运行在同一进程中,也可以运行在不同进程中.当组件运行在同一进程中进行通信就显得比较简单,在之前的Android线程间通信机制中已经讲过了:而当它们运行在不同的进程 中时,就需要使用我们本文中所要介绍的Binder机制了. Binder作为一种进程间通信机

android进程间通信:使用AIDL

欢迎阅读本文,你能关注本文,你知道你需要进程间通信.需要AIDL(以及Binder),那么可以默认你对这些概念已经有了一些了解,你(大致)知道它们是什么,它们有什么用,所以为了节约大家的眼力和时间,在此我不复制粘贴网上泛滥的博客或者翻译冗长的android文档. 关于AIDL的介绍在文档:docs/guide/developing/tools/aidl.html 关于IBinder的介绍在文档:docs/reference/android/os/IBinder.html 以及Binder:doc

Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务. 传送门: Android native进程间通信实例-binder篇之——简单的单工通信 这次可以用到这个命令了! 1. 随机选取一个java层的服务. adb shell 中输入命令 service list,选取一个服务来做研究,这次看中的是 textservices, 注意第一个服务 by

Android进程间通信(IPC)的AIDL机制:Hello World示例

Android实现IPC可使用Android本身提供的AIDL机制.网上也有很多相关文章,但写的过于繁琐和麻烦,重点也不突出.本文抽丝剥茧从工程角度给出一个最简单的Android AIDL例程关键代码,以最简单的形式说明如何在代码中使用Android AIDL. AIDL首先在逻辑上可分为"服务端"和"客户端".在本示例中,则以两个完全不同.互相独立的Eclipse 项目代表. (1)server.一个Android App,即AIDL的服务端服务提供者. (2)c

Android进程间通信之使用AIDL

AIDL(Android Interface Definition Language ),可实现进程间的通信,并且允许多线程访问.(如果需要进程间通信,又不需要处理多线程访问,那么使用Messenger的方式更为合适),实现AIDL,需要以下几个步奏. 1.定义AIDL接口 AIDL接口使用后缀名为.aidl的文件来定义(例如创建一个IRemoteData.aidl),使用java语法来编写,在编译时,Android sdk工具会在/gen目录下生成一个java文件(IRemoteData.ja

Android进程间通信之----Aidl传递对象

转载请注明出处 CSDN废墟的树 前言 有关Android进程间通信之Aidl编程的基本使用步骤已经在上一篇博客中有讲解,Android studio 下的aidl编程实现Android的夸进程间通信.上一篇博客中只是演示了怎么利用Aidl实现跨进程间传递Java基本类型,以及Aidl传递Bitamap对象.可能在一些场景下你需要跨进程传递一个对象,那么Aidl是否能传递一个对象呢?答案是肯定的,网上也有很多相关的资料,之所以写这篇博客:一是当作自己学习笔记咯,二是把自己遇到的问题分享出来. A

Android进程间通信

如果想要进行IPC通信,一般写一个AIDL接口,再写一个Service子类,然后实现AIDL接口 当做IBinder返回给Activity界面层. 如果不想写AIDL接口文件,只是单线程中与Service进行通信 我们可以用Android写好的Messenger类来处理,一样能将消息传递给Service进行通信. 什么是aidl: aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程

饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51464518 Android进程间通信IPC是比较高级的话题,很多Android程序员碰到IPC就觉得头疼,尤其是AIDL这类东西. 公司最近在研究DroidPlugin插件开发,DroidPlugin把每个子app都变成一个进程.这样的话子app和主app如果需要共享数据,就需要IPC.所以我开发了Hermes框架,让IPC变得非常简单优雅

Android进程间通信详细介绍

1.为什么需要多个进程? 默认情况下,一个Android应用中所有的组件都会运行在以包名为进程名的单个进程中,但是由于Android自身平台的一些限制或者多进程固有的一些好处,导致很多应用在实现的时候不得不选择多进程的实现方式: 1.1. Android系统对每一个应用进程的内存占用有限制,视具体设备的情况,我的测试机的单个应用的内存限制为128M,比较大了,早期的Android设备由于总的内存大小限制,对单个应用的内存限制的比较小24M或者更小.所以如果应用需要占用很大的内存,可以考虑将一些组