`

玩转Andorid---组件篇---Service(服务)之RPC远程进程调用

阅读更多

 

Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信。为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Service中的一个方法,那么就可以通过这种方式来实现了。

AIDL RPC机制是通过接口来实现的,类似Windows中的COM或者Corba,但他是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个接口Ibinder接口。

 

实例练习:

<!--[if !supportLists]-->1、  <!--[endif]-->创建一个项目,在包中创建一个AIDL文件,定义一个AIDL文件的语法和定义一个JAVA接口的语法类似,只不过文件的扩展名是“.aidl”。在AIDL文件中可以声明任一多个方法,方法可以带参数,也可以有返回值,参数和返回值是任意类型。需要注意的是,你必须导入除了内建类型(例如:int,boolean等)外的任何其他类型,即使他们在同一个包中,具体规则如下:

<!--[if !supportLists]-->     <!--[endif]-->JAVA原始类型不需要导入

<!--[if !supportLists]-->     <!--[endif]-->String,List,MapCharSequence不需要导入

定义好的 AIDL文件可以使用ADT插件自动生成java代码

 

现在开始写代码:

创建一个名字为IPerson.aidl的文件

 

package org.hualang.rpc;

//IPerson接口
interface IPerson
{
	//设置年龄
	void setAge(int age);
	//设置姓名方法
	void setName(String name);
	//显示信息方法
	String display();
}

 2、当创建好这个文件后,刷新工程,就会在gen目录下看到这个java接口



 当你分析了这个代码后会发现,它是使用的代理模式来实现的,我们一般定义该接口的静态内部类Stub的asInterface()方法,返回我们的接口

3、实现AIDL文件生成的JAVA接口

AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现

我们可以定义一个实现类,PerionImpl,该类继承Stub类,实现我们定义的3个方法

/**
 * @author hualang
 * IPerson接口实现类
 */
package org.hualang.rpc;

import android.os.RemoteException;

public class IPersonImpl extends IPerson.Stub {
	//声明两个变量
	private int age;
	private String name;
	//显示name和age
	public String display() throws RemoteException
	{
		return "name="+name+";age="+age;
	}
	@Override
	public void setAge(int age) throws RemoteException {
		// TODO Auto-generated method stub
		this.age = age;
	}

	@Override
	public void setName(String name) throws RemoteException {
		// TODO Auto-generated method stub
		this.name = name;
	}
	
}

 4、将你的接口暴露给客户端

现在我们已经实现了IPerson接口,接下俩我们要看看如何将该接口暴露给客户端调用。一般我们通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们板顶该接口时调用该方法。

/**
 * @author hualang
 * 使用Service将接口暴露给客户端
 */
package org.hualang.rpc;

import org.hualang.rpc.IPerson.Stub;

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

public class RemoteService extends Service {
	//声明IPerson接口
	private Stub iperson = new IPersonImpl();
	public IBinder onBind(Intent intent)
	{
		return iperson;
	}
}

 5、客户端调用

接下来定义一个Activity来绑定远程Service,获得IPerson接口,通过RPC机制调用接口中的方法。

/**
 * @author hualang
 * IPerson接口实现类
 */
package org.hualang.rpc;

import android.app.Activity;
import android.app.Service;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class RPCTest extends Activity {
    /** Called when the activity is first created. */
	private IPerson iPerson;
	private Button btn;
	private ServiceConnection conn = new ServiceConnection()
	{
		synchronized public void onServiceConnected(ComponentName name, IBinder service) {
			// 获得IPerson接口
			iPerson = IPerson.Stub.asInterface(service);
			if (iPerson != null)
				try {
					// RPC 方法调用
					iPerson.setName("花郎");
					iPerson.setAge(22);
					String msg = iPerson.display();
					// 显示方法调用返回值
					Toast.makeText(RPCTest.this, msg, Toast.LENGTH_LONG)
							.show();
				} catch (RemoteException e) {
					e.printStackTrace();
				}
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
	};
	//声明IPerson接口
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.Button01);
        btn.setOnClickListener(new OnClickListener()
        {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setAction("org.hualang.rpc.RPC_ACTION");
				bindService(intent, conn, Service.BIND_AUTO_CREATE);
			}
        	
        }
       );
    }
}

 6、注意要在AndroidManifest.xml文件中注册Service

		<service
			android:name=".RemoteService">
			<intent-filter>
				<action android:name="org.hualang.rpc.RPC_ACTION"/>
			</intent-filter>
		</service>

 

运行结果如下:当点击按钮后,就会弹出远程调用后的Toast


 

 

 

  • 大小: 5 KB
  • 大小: 11.2 KB
2
0
分享到:
评论

相关推荐

    andorid-sdk-windows.tools

    android, sdk, andorid-sdk_r17-windows, tools ,解压放到andorid-sdk_r-windows目录下。配合platform-tools, ADT-17使用

    andorid-check-system.rar_教室管理系统

    本文将深入解析这个名为"andorid-check-system.rar"的项目,从核心功能、设计架构到实现细节进行详细阐述。 首先,该系统设定为两个主要角色:服务端管理员和客户端用户。服务端管理员具有高级权限,负责维护整个...

    andorid-饼图API.rar

    "andorid-饼图API.rar"这个压缩包很可能包含了一个用于绘制饼图的Android库,可能是开发者已经封装好的类或者组件。 Android饼图API的关键知识点包括以下几个方面: 1. **绘图库选择**:Android官方SDK并没有直接...

    andorid-饼状图.rar

    本文将深入探讨如何在Android应用中创建和使用饼状图,基于提供的"andorid-饼状图.rar"压缩包,我们可以假设其中包含了一个用于实现饼状图的示例代码或库。 首先,Android饼状图通常通过第三方库实现,如`...

    基于TINY4412的Andorid开发-------简单的LED灯控制源代码

    8. **源代码结构**:虽然没有提供具体的源代码,但通常一个这样的项目会包含Activity(负责用户界面交互)、Service(处理后台通信)、BroadcastReceiver(处理USB或蓝牙连接事件)等组件。 9. **安全与优化**:...

    andorid-背景改变摇晃手机感应.rar

    这个"andorid-背景改变摇晃手机感应"压缩包文件包含了一个实现此类功能的项目,下面将详细介绍相关的Android开发知识和技术点。 1. **传感器(Sensor)API**:Android系统提供了丰富的传感器API,可以让开发者访问...

    andorid-wifi检测.zip

    "andorid-wifi检测.zip"这个压缩包很可能包含了用于检查和分析Android设备WiFi性能的工具或代码库。以下是一些可能包含在其中的关键知识点: 1. **WiFi扫描与连接**:在Android系统中,可以通过调用`WifiManager`类...

    andorid- 多线程

    它通过创建一个包含Looper的独立线程,可以处理来自Handler的消息,适用于需要长时间运行的服务或者复杂的后台逻辑。 ##### Swimming in Threadpools - **ThreadPool**:适用于需要同时处理多个任务的场景。...

    andorid-猜拳游戏.rar

    - 创建 `Random` 实例,然后调用 `nextInt(3)` 来获取0到2之间的随机整数。 4. **胜负判断**: - 判断规则遵循石头胜剪刀、剪刀胜布、布胜石头的循环关系。 - 编写条件语句或者switch语句来判断玩家和系统的胜负...

    Android代码-Andorid-LiteHybrid-WebView

    轻量级 H5 Native Hybrid 框架 轻量级litehybrid框架适合适合...其中,H5调用 native,以 JSONObject 方式传递调用信息,格式约定如下: { "invoke": "ANNOTATION_METHOD" "paras": JSONObject } 其中,"invoke

    andorid-饼图带引导线.rar

    在“andorid-饼图带引导线.rar”这个压缩包中,我们很显然关注的是如何在Android应用中实现具有引导线功能的饼图。引导线在饼图中的作用是帮助用户更好地理解数据点所代表的信息,它可以指示从饼图的一个扇区到相...

    andorid-tabHost展示数据listview.rar

    在Android开发中,TabHost是一个非常重要的组件,它允许开发者在一个Activity中创建多个Tab来展示不同的内容区域。这个“android-tabHost展示数据listview.rar”压缩包文件显然包含了一个示例,展示了如何在TabHost...

    andorid-饼图&柱状图.rar

    总的来说,Android平台上的饼图和柱状图实现主要依赖于第三方库,如MPAndroidChart,开发者需要了解其API用法,进行数据设置和样式定制,以创建符合需求的可视化组件。同时,为了提高用户体验,还需考虑图表的交互性...

    Android---UI篇

    •Andorid---UI篇---TableLayout(表格布局) • •Android---UI篇---RelativeLayout(相对布局) • •Android---UI篇---GridView(网格布局) • •Android---UI篇---Gallery(画廊视图) • •Android---UI篇---...

    andorid-捕鱼达人源代码.rar

    【Android 捕鱼达人源代码解析】 在Android开发领域,捕鱼达人是一款广受欢迎的休闲游戏,其源代码对于开发者来说具有很高的学习价值。通过分析和研究这款游戏的源代码,我们可以深入理解Android游戏开发的基本架构...

    安卓java读取网页源码-Andorid-learning:Andorid-学习

    Andorid-learning 目录: 0-0 0-1 1-1 1-2 1-3 1-4 0-0 隐藏顶部栏状态栏 在代码 oncreate: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...

    andorid-TAB界面(滑动切换).zip

    在Android开发中,创建一个可滑动切换的TAB界面是一项常见的需求,这通常涉及到用户界面(UI)设计和页面导航。Android提供了多种方式来实现这样的功能,例如使用`ViewPager`配合`TabLayout`,或者自定义控件。...

    andorid-HTML5.zip_android_android html5_html5_html5 android_查询 h

    这个名为"andorid-HTML5.zip"的压缩包显然包含了一些关于如何在Android平台上利用HTML5技术来实现机票查询界面的资源。让我们深入探讨一下这个主题。 HTML5是一种超文本标记语言的最新版本,它引入了许多新特性,如...

    andorid-26

    4. **后台限制**:为了优化电池寿命,Android 8.0限制了应用在后台运行的能力,如限制后台服务和位置更新,这被称为“后台执行限制”。 5. **Instant Apps**:无需安装,用户可以直接通过链接体验应用的部分功能,...

Global site tag (gtag.js) - Google Analytics