- 浏览: 760727 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (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 2628在Android系统中提供了两种动画实现方式:一种是Tween ... -
玩转Android---2D图形及动画---图片处理
2011-09-26 13:08 1780在Android中很多地方都使 ... -
玩转Android--UI篇--PreferenceActivity(开启wifi和音乐等)
2011-09-01 11:57 4850本测试主要是为了测试PreferenceActivity的使用 ... -
玩转Android---2D图形及动画---Gif动画
2011-08-05 09:36 2217由于Gif本身就是动画,所以如果能够直接使用的话,会省去很多的 ... -
玩转Android---2D图形及动画---Frame动画
2011-08-01 20:53 2085Frame动画其实就是逐帧动画,用法也比Tween动画简单,只 ... -
玩转Android---2D图形及动画---Tween动画
2011-07-31 22:53 2179Android平台提供了两类动画,分别是Tween动画,和Fr ... -
玩转Android---2D图形及动画---View类使用
2011-07-30 23:39 2800由于游戏界面是由大量美工资源图片构成的,所以,在设计游戏界面的 ... -
玩转Android--组件篇---Handler的使用
2011-07-30 14:01 5359public class Handler ... -
玩转Android---UI篇---ZoomControls放大缩小图片
2011-07-27 13:03 7248ZoomControls控件是一个可以缩放但控件,效果如下图 ... -
玩转Android---组件篇---TextSwitcher
2011-07-25 09:21 2193还记得有一次淘宝的电话面试的时候问了我一个关于Android的 ... -
玩转Android---组件篇---AnalogClock,DigitalClock
2011-07-10 19:28 2940首先要说的是,这两个控件并不是经常的使用,但是如果程序需要的话 ... -
玩转Android---组件篇---SeekBar,RatingBar,Chronometer
2011-07-10 19:12 2855今天补充三个组件的使用,避免日后忘记。它们分别是 SeekB ... -
玩转Android---组件篇---Handler的使用(2)
2011-05-28 17:15 2821对于Handler来说,它和与它调用它的Activity是出于 ... -
玩转Android---组件篇---Handler的使用(1)
2011-05-28 15:37 2173在android中,有很多功能是不能放在onCreate或者o ... -
玩转Android---事件监听篇---第2篇
2011-05-27 10:30 5249事件监听篇---第二篇 下面是各种常用控件的事件监听的 ... -
玩转Android---事件监听篇---第1篇
2011-05-26 21:29 9933事件就是用户与UI界面的交互时所触发的操作。比如点击某一个按钮 ... -
玩转Android---组件篇---数据存储之SQLite
2011-04-17 17:05 8483Android中通过SQLite数据库引擎来实现结构化数据存储 ... -
玩转Android---组件篇---数据存储之File
2011-04-17 11:07 2046我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本 ... -
玩转Andorid---组件篇---数据存储之preference
2011-04-14 21:58 2303程序是数据的输入、处 ... -
玩转Android---组件篇---Broadcast Receiver(广播接收器)
2011-04-14 19:24 29346Braodcast Receiver顾名思义 ...
相关推荐
android, sdk, andorid-sdk_r17-windows, tools ,解压放到andorid-sdk_r-windows目录下。配合platform-tools, ADT-17使用
本文将深入解析这个名为"andorid-check-system.rar"的项目,从核心功能、设计架构到实现细节进行详细阐述。 首先,该系统设定为两个主要角色:服务端管理员和客户端用户。服务端管理员具有高级权限,负责维护整个...
"andorid-饼图API.rar"这个压缩包很可能包含了一个用于绘制饼图的Android库,可能是开发者已经封装好的类或者组件。 Android饼图API的关键知识点包括以下几个方面: 1. **绘图库选择**:Android官方SDK并没有直接...
本文将深入探讨如何在Android应用中创建和使用饼状图,基于提供的"andorid-饼状图.rar"压缩包,我们可以假设其中包含了一个用于实现饼状图的示例代码或库。 首先,Android饼状图通常通过第三方库实现,如`...
8. **源代码结构**:虽然没有提供具体的源代码,但通常一个这样的项目会包含Activity(负责用户界面交互)、Service(处理后台通信)、BroadcastReceiver(处理USB或蓝牙连接事件)等组件。 9. **安全与优化**:...
这个"andorid-背景改变摇晃手机感应"压缩包文件包含了一个实现此类功能的项目,下面将详细介绍相关的Android开发知识和技术点。 1. **传感器(Sensor)API**:Android系统提供了丰富的传感器API,可以让开发者访问...
"andorid-wifi检测.zip"这个压缩包很可能包含了用于检查和分析Android设备WiFi性能的工具或代码库。以下是一些可能包含在其中的关键知识点: 1. **WiFi扫描与连接**:在Android系统中,可以通过调用`WifiManager`类...
它通过创建一个包含Looper的独立线程,可以处理来自Handler的消息,适用于需要长时间运行的服务或者复杂的后台逻辑。 ##### Swimming in Threadpools - **ThreadPool**:适用于需要同时处理多个任务的场景。...
- 创建 `Random` 实例,然后调用 `nextInt(3)` 来获取0到2之间的随机整数。 4. **胜负判断**: - 判断规则遵循石头胜剪刀、剪刀胜布、布胜石头的循环关系。 - 编写条件语句或者switch语句来判断玩家和系统的胜负...
轻量级 H5 Native Hybrid 框架 轻量级litehybrid框架适合适合...其中,H5调用 native,以 JSONObject 方式传递调用信息,格式约定如下: { "invoke": "ANNOTATION_METHOD" "paras": JSONObject } 其中,"invoke
在“andorid-饼图带引导线.rar”这个压缩包中,我们很显然关注的是如何在Android应用中实现具有引导线功能的饼图。引导线在饼图中的作用是帮助用户更好地理解数据点所代表的信息,它可以指示从饼图的一个扇区到相...
在Android开发中,TabHost是一个非常重要的组件,它允许开发者在一个Activity中创建多个Tab来展示不同的内容区域。这个“android-tabHost展示数据listview.rar”压缩包文件显然包含了一个示例,展示了如何在TabHost...
总的来说,Android平台上的饼图和柱状图实现主要依赖于第三方库,如MPAndroidChart,开发者需要了解其API用法,进行数据设置和样式定制,以创建符合需求的可视化组件。同时,为了提高用户体验,还需考虑图表的交互性...
•Andorid---UI篇---TableLayout(表格布局) • •Android---UI篇---RelativeLayout(相对布局) • •Android---UI篇---GridView(网格布局) • •Android---UI篇---Gallery(画廊视图) • •Android---UI篇---...
【Android 捕鱼达人源代码解析】 在Android开发领域,捕鱼达人是一款广受欢迎的休闲游戏,其源代码对于开发者来说具有很高的学习价值。通过分析和研究这款游戏的源代码,我们可以深入理解Android游戏开发的基本架构...
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); ...
在Android开发中,创建一个可滑动切换的TAB界面是一项常见的需求,这通常涉及到用户界面(UI)设计和页面导航。Android提供了多种方式来实现这样的功能,例如使用`ViewPager`配合`TabLayout`,或者自定义控件。...
这个名为"andorid-HTML5.zip"的压缩包显然包含了一些关于如何在Android平台上利用HTML5技术来实现机票查询界面的资源。让我们深入探讨一下这个主题。 HTML5是一种超文本标记语言的最新版本,它引入了许多新特性,如...
4. **后台限制**:为了优化电池寿命,Android 8.0限制了应用在后台运行的能力,如限制后台服务和位置更新,这被称为“后台执行限制”。 5. **Instant Apps**:无需安装,用户可以直接通过链接体验应用的部分功能,...