- 浏览: 74079 次
- 性别:
- 来自: 成都
文章分类
最新评论
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事。
AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件
如果你正在使用eclipse的Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:
当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件
package org.allin.android.remote; interface IMusicControlService{ void play(); void stop(); void pause(); }
如果你正在使用eclipse的Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:
public class RemoteMusicService extends Service { private static final String TAG = "RemoteMusicService"; private MediaPlayer mediaPlayer; /* * (non-Javadoc) * * @see android.app.Service#onBind(android.content.Intent) */ @Override public IBinder onBind(Intent intent) { return binder; } private final IMusicControlServic<script type="text/javascript"><!--mce:1--></script>e.Stub binder = new IMusicControlService.Stub() { @Override public void stop() throws RemoteException { Log.d(TAG,"stop...."); if (mediaPlayer != null) { mediaPlayer.stop(); try { // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数 mediaPlayer.prepare(); } catch (IOException ex) { ex.printStackTrace(); } } } @Override public void play() throws RemoteException { Log.d(TAG,"play...."); if (mediaPlayer == null) { mediaPlayer = MediaPlayer.create(RemoteMusicService.this, R.raw.tmp); mediaPlayer.setLooping(false); } if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } } @Override public void pause() throws RemoteException { Log.d(TAG,"pause...."); if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } }; @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); if(mediaPlayer != null){ mediaPlayer.stop(); mediaPlayer.release(); } } }
当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { musicService = null; Log.d(TAG, "in onServiceDisconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { musicService = IMusicControlService.Stub.asInterface(service); Log.d(TAG, "in onServiceConnected"); } };
发表评论
-
android检测当前网络是否可用
2012-05-28 20:43 1098在android程序中运行第一步就是检测当前有无可用网络 如 ... -
java面试之抽象类和接口知识点
2012-05-27 18:13 7961.abstract class 在 Java 语 ... -
点击两次back退出程序
2012-04-17 22:48 912private long exitTime = 0; ... -
【转】爱上Android“9妹”
2012-01-17 17:38 794前几天群成员讨论过关于9patch的工具【我比较喜欢喊它9妹子 ... -
【转】android service 学习(上)
2012-01-13 22:31 679Service是android 系统中的一种组件,它跟Acti ... -
ndroid 使用代码打开浏览器,打电话,开地图
2011-11-03 13:37 8331,调用web浏览器 Uri myBlogUri = Uri. ... -
java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
2011-11-03 10:57 1066最近在做电信的一个视频地图项目时,需要获取网络图片预览,用到图 ... -
【转】Android中的.9.png图形的机制及制作和使用方法
2011-10-25 10:31 1657转至:http://blog.sina.com.cn/s/bl ... -
MIUI直刷正确开启A2SD+的方法(htc系)
2011-10-21 18:32 1126第一步:在Recovery里对 SD卡进行分区 : 分区后 ... -
自定义Android 标题栏TitleBar布局
2011-10-21 18:09 3529自定义Android 标题栏TitleBar布局 方法一、 ... -
Android 去掉title bar的3个方法
2011-09-26 14:44 165611. Java代码实现 @Override public v ... -
Android平台显示单位px和dip以及sp的区别
2011-06-08 15:55 829很多网友可能发现在Android的layout文件中layou ... -
【转】禁止android横屏和竖屏的切换
2011-06-01 15:42 1604在某些场合可能需要禁止横屏和竖屏切换,实现这个要求很简单,只要 ... -
【转】动画的两种实现模式Animation
2011-05-10 21:05 1270关于动画的实现,Android提供了Animation,在 ... -
【转】动画的实现Animation
2011-05-10 20:59 0关于动画的实现,Android ... -
【转】TextView如何高亮显示文本
2011-05-09 16:25 901转自:http://dev.10086.cn/blog/?ui ... -
【转】android 图片自动切换
2011-05-01 22:33 1333图片自动切换 res/drawable/update.xml ... -
【转】PendingIntent和Intent的区别
2011-04-27 13:54 709Notification n = new Notificati ... -
【转】 AutoCompleteTextView和MultiAutoCompleteTextView的区别
2011-04-26 10:28 1176android提供了自动提示功能的textview,按照自 ...
相关推荐
android service 学习(下) ,共两部分
android学习之Service启动1
这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
android service 学习笔记(上、下)android service 学习笔记(上、下)
android service 学习笔记(上、下)
这个是学习Android Service时的一个练习!
android service 源码 学习
用android的service做的音乐播放器,让service后台播放.mp3文件
android service 学习(上),共两部分
这是自己学习android中service组件的代码,供以后查看用。
Android在开机启动后系统会发出一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED,这个Action只会发出一次。
分析了framework中battery相关知识。
Service学习资料,包含Service的定义使用,两种启动方式。有两个demo,里面有介绍service基础知识,自定义Binder,如果与Activity通信。详情也可参考:http://blog.csdn.net/u012764110/article/details/48491567
Service学习时模仿别人实现的断电下载功能,使用Sqlite保持线程信息
这是我自己学习android service写的demo,详细介绍了创建service的步骤及用法。 还有android service与activity的交互操作。
NULL 博文链接:https://chaowen0668.iteye.com/blog/1090096
Android之Service学习总结收集.pdf
小例子很实用,可以了解学习下Android强大的service功能 比如定时提醒,背景音乐播放等用service怎么实现。
这是Pro Android学习系列中http service的例子源代码。
介绍android系统中 sensor的服务框架,对于学习framework以及系统架构的 有点帮助