- 浏览: 752764 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (139)
- 玩转Android (48)
- Android创意美工 (0)
- Android杂谈 (23)
- Android实例练习 (2)
- Android ROM研究 (5)
- Android NDK开发指南 (5)
- Android NDK (0)
- Android Tips (3)
- Windows Phone 7 (5)
- iPhone (0)
- HTML5学习室 (0)
- JAVA (9)
- SSH+ibatis (8)
- PHP (0)
- IT生活 (1)
- linux (2)
- C (4)
- C++ (1)
- web 前端 (1)
- 云计算 (0)
- 设计模式 (0)
- C# (2)
- 其他 (1)
- 数据结构 (5)
- Web开发 (10)
- 数据库 (3)
- 搜索引擎 (0)
- Go语言 (0)
最新评论
-
wi100sh:
多谢分享~
玩转Android---UI篇---ImageButton(带图标的按钮) -
zhanghaichang:
好文章的。
高性能web开发技术(一) -
yingang:
引用classes.dex.dex2jar.jar 拖入 j ...
Andorid杂谈---Apk文件的反编译 -
扶摇诺:
讲解的简明易懂,多谢啦!
玩转Android---UI篇---LinearLayout(线性布局) -
a13429921973:
更为详细的图文介绍,可参考这个http://blog.csdn ...
Android ROM研究---CyanogenMod源代码下载及编译
在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,Map和CharSequence不需要导入
定义好的 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
发表评论
-
玩转Android---2D图形及动画---动画分析(Tween详细分析)
2011-09-26 21:59 2579在Android系统中提供了两种动画实现方式:一种是Tween ... -
玩转Android---2D图形及动画---图片处理
2011-09-26 13:08 1720在Android中很多地方都使 ... -
玩转Android--UI篇--PreferenceActivity(开启wifi和音乐等)
2011-09-01 11:57 4776本测试主要是为了测试PreferenceActivity的使用 ... -
玩转Android---2D图形及动画---Gif动画
2011-08-05 09:36 2162由于Gif本身就是动画,所以如果能够直接使用的话,会省去很多的 ... -
玩转Android---2D图形及动画---Frame动画
2011-08-01 20:53 2025Frame动画其实就是逐帧动画,用法也比Tween动画简单,只 ... -
玩转Android---2D图形及动画---Tween动画
2011-07-31 22:53 2137Android平台提供了两类动画,分别是Tween动画,和Fr ... -
玩转Android---2D图形及动画---View类使用
2011-07-30 23:39 2752由于游戏界面是由大量美工资源图片构成的,所以,在设计游戏界面的 ... -
玩转Android--组件篇---Handler的使用
2011-07-30 14:01 5307public class Handler ... -
玩转Android---UI篇---ZoomControls放大缩小图片
2011-07-27 13:03 7207ZoomControls控件是一个可以缩放但控件,效果如下图 ... -
玩转Android---组件篇---TextSwitcher
2011-07-25 09:21 2149还记得有一次淘宝的电话面试的时候问了我一个关于Android的 ... -
玩转Android---组件篇---AnalogClock,DigitalClock
2011-07-10 19:28 2877首先要说的是,这两个控件并不是经常的使用,但是如果程序需要的话 ... -
玩转Android---组件篇---SeekBar,RatingBar,Chronometer
2011-07-10 19:12 2802今天补充三个组件的使用,避免日后忘记。它们分别是 SeekB ... -
玩转Android---组件篇---Handler的使用(2)
2011-05-28 17:15 2758对于Handler来说,它和与它调用它的Activity是出于 ... -
玩转Android---组件篇---Handler的使用(1)
2011-05-28 15:37 2110在android中,有很多功能是不能放在onCreate或者o ... -
玩转Android---事件监听篇---第2篇
2011-05-27 10:30 5194事件监听篇---第二篇 下面是各种常用控件的事件监听的 ... -
玩转Android---事件监听篇---第1篇
2011-05-26 21:29 9893事件就是用户与UI界面的交互时所触发的操作。比如点击某一个按钮 ... -
玩转Android---组件篇---数据存储之SQLite
2011-04-17 17:05 8434Android中通过SQLite数据库引擎来实现结构化数据存储 ... -
玩转Android---组件篇---数据存储之File
2011-04-17 11:07 1996我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本 ... -
玩转Andorid---组件篇---数据存储之preference
2011-04-14 21:58 2256程序是数据的输入、处 ... -
玩转Android---组件篇---Broadcast Receiver(广播接收器)
2011-04-14 19:24 29252Braodcast Receiver顾名思义 ...
相关推荐
android, sdk, andorid-sdk_r17-windows, tools ,解压放到andorid-sdk_r-windows目录下。配合platform-tools, ADT-17使用
andorid-猜拳游戏,本人亲测,可以使用,放心下载吧!!
andorid-饼状图,本人亲测,可以使用,放心下载吧!!
andorid-饼图API,本人亲测,可以使用,放心下载吧!!
andorid-wifi检测,本人亲测,可以使用,放心下载吧!!
andorid-tabHost展示数据listview,本人亲测,可以使用,放心下载吧!!
andorid-捕鱼达人源代码,本人亲测,可以使用,放心下载吧!!
andorid-饼图带引导线,本人亲测,可以使用,放心下载吧!!
andorid-饼图&折线图&柱状图,本人亲测,可以使用,放心下载吧!!
andorid-背景改变摇晃手机感应,本人亲测,可以使用,放心下载吧!!
andorid-TAB界面(滑动切换),本人亲测,可以使用,放心下载吧!!
轻量级 H5 Native Hybrid 框架 轻量级litehybrid框架适合适合...其中,H5调用 native,以 JSONObject 方式传递调用信息,格式约定如下: { "invoke": "ANNOTATION_METHOD" "paras": JSONObject } 其中,"invoke
内部培训用的 android 多线程讲义,方便大家.
andorid-25 下载完成后,直接复制到platforms下,解压即可
•Andorid---UI篇---TableLayout(表格布局) • •Android---UI篇---RelativeLayout(相对布局) • •Android---UI篇---GridView(网格布局) • •Android---UI篇---Gallery(画廊视图) • •Android---UI篇---...
基于TINY4412的Andorid开发-------简单的LED灯控制/源代码,此下载只包含源代码
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); ...
系统有2个身份 一个服务端管理员 一个是客户端用户! 管理员可以添加和管理用户,可以添加和管理教室状态信息 修改自己的登录密码 一般用户从手机客户端登录可以按照教室编号和教室状态查询!
Andorid-OpenCV-人像相机使用OpenCV库 实现人像相机视图
android mail必备jar包(mail.jar,activation.jar,additionnal.jar三件套),非手机系统邮件和调用第三方客户端,引入到Lib,导入工程即可使用