- 浏览: 75247 次
- 性别:
- 来自: 成都
文章分类
最新评论
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序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 1134在android程序中运行第一步就是检测当前有无可用网络 如 ... -
java面试之抽象类和接口知识点
2012-05-27 18:13 8381.abstract class 在 Java 语 ... -
点击两次back退出程序
2012-04-17 22:48 964private long exitTime = 0; ... -
【转】爱上Android“9妹”
2012-01-17 17:38 825前几天群成员讨论过关于9patch的工具【我比较喜欢喊它9妹子 ... -
【转】android service 学习(上)
2012-01-13 22:31 721Service是android 系统中的一种组件,它跟Acti ... -
ndroid 使用代码打开浏览器,打电话,开地图
2011-11-03 13:37 8761,调用web浏览器 Uri myBlogUri = Uri. ... -
java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
2011-11-03 10:57 1107最近在做电信的一个视频地图项目时,需要获取网络图片预览,用到图 ... -
【转】Android中的.9.png图形的机制及制作和使用方法
2011-10-25 10:31 1701转至:http://blog.sina.com.cn/s/bl ... -
MIUI直刷正确开启A2SD+的方法(htc系)
2011-10-21 18:32 1161第一步:在Recovery里对 SD卡进行分区 : 分区后 ... -
自定义Android 标题栏TitleBar布局
2011-10-21 18:09 3567自定义Android 标题栏TitleBar布局 方法一、 ... -
Android 去掉title bar的3个方法
2011-09-26 14:44 166161. Java代码实现 @Override public v ... -
Android平台显示单位px和dip以及sp的区别
2011-06-08 15:55 866很多网友可能发现在Android的layout文件中layou ... -
【转】禁止android横屏和竖屏的切换
2011-06-01 15:42 1632在某些场合可能需要禁止横屏和竖屏切换,实现这个要求很简单,只要 ... -
【转】动画的两种实现模式Animation
2011-05-10 21:05 1323关于动画的实现,Android提供了Animation,在 ... -
【转】动画的实现Animation
2011-05-10 20:59 0关于动画的实现,Android ... -
【转】TextView如何高亮显示文本
2011-05-09 16:25 939转自:http://dev.10086.cn/blog/?ui ... -
【转】android 图片自动切换
2011-05-01 22:33 1371图片自动切换 res/drawable/update.xml ... -
【转】PendingIntent和Intent的区别
2011-04-27 13:54 749Notification n = new Notificati ... -
【转】 AutoCompleteTextView和MultiAutoCompleteTextView的区别
2011-04-26 10:28 1213android提供了自动提示功能的textview,按照自 ...
相关推荐
### Android Service 学习(下): 进程间通信与 AIDL 在深入探讨 Android Service 的高级用法时,我们不可避免地会接触到进程间通信(IPC)这一关键概念。由于 Android 应用程序通常在各自独立的进程中运行,因此它们...
这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
本篇文章将深入探讨“android学习之Service启动1”的主题,主要关注Service的启动方式及其基本用法。 首先,Service有两种启动模式:startService()和bindService()。`startService()`主要用于启动一个无需与调用者...
本案例“android音乐播放器service学习案例”着重讲解如何利用Service来实现一个音乐播放器,使音乐能够在后台持续播放。 首先,我们需要了解Android Service的基础知识。Service分为两种类型:标准服务...
在Android开发中,Service是应用组件之一,它可以在后台长时间运行,即使用户界面...通过“android service toast 01”这个项目,开发者可以深入学习Android后台服务的使用,以及如何在非主线程中正确地更新用户界面。
### Android学习之Service开机启动详解 #### 一、引言 在Android开发中,有时我们需要让应用程序中的某个服务(Service)在设备启动时自动运行,例如进行后台数据同步、监控某些变化等。为了实现这一需求,可以...
在“android service 学习笔记(下)”中,主要讨论了如何利用AIDL(Android Interface Definition Language)进行跨进程通信(IPC, Inter-Process Communication)。 AIDL是一种接口描述语言,它的作用是在Android...
在后续的《androidservice学习(下)》中,将探讨通过AIDL实现Service的远程调用,进一步扩展Service的功能性和灵活性,实现跨进程通信。这一部分将深入讲解AIDL的基本概念、配置过程及其实现细节,为开发者提供更全面...
学习这个实例,开发者可以理解Service的运作机制,如何在实际项目中应用Service,以及如何处理Service与Activity之间的通信。这对于构建高效、稳定的Android应用至关重要,特别是对于那些需要在后台持续运行的任务。...
在"android中service组件自我学习练习"中,我们可能涉及到以下几个关键知识点: 1. **Service的声明**:在AndroidManifest.xml文件中,需要声明Service组件,指定其类名,以便系统能够识别和加载。 2. **Service的...
提到的"Exercise"可能是练习文件或者代码示例,通常在学习Service时,开发者会创建一个简单的Service项目,模拟启动Service,然后在另一个Activity中控制Service的启动和停止,或者绑定和解绑,以加深理解。...
在Android应用开发中,...通过学习和实践这个Demo,开发者可以更好地理解和掌握Android中Service和AIDL的使用,提升应用的扩展性和功能。在开发过程中,合理运用Service和AIDL可以实现复杂的应用架构,提高用户体验。
在《android service 学习笔记(下)》中,会介绍如何通过AIDL(Android Interface Definition Language)实现对Service的远程调用,这允许不同进程间的组件通信,增强了Service的功能和使用范围。 总结来说,...
在Android开发中,Service是一种非常重要的组件,它可以在后台长时间运行,执行一些不需要与用户交互的任务。本示例中,我们关注的是如何利用Service来实现资源的异步下载,并且在下载完成后对ZIP文件进行解压。这个...
在"Android学习之Service练习"中,我们将深入探讨如何创建、启动和绑定到`Service`,以及`Service`在实际应用中的常见用途。 1. **什么是Service?** `Service` 是Android四大组件之一,用于执行长时间运行的操作...
本篇将详细介绍Android Service的源码学习及其关键知识点。 首先,我们来了解Service的基本生命周期。在Android中,Service的启动与绑定是通过`startService()`和`bindService()`方法完成的。当调用`startService()...
在Android应用开发中,Service是四大组件之一,用于在后台长时间运行操作,比如播放音乐、网络通信等。然而,如果不加以控制,...通过学习和实践,你将能够更好地掌握Android Service的管理和控制,提高你的应用质量。
通过深入学习Service的源码,结合各种工具进行调试和分析,开发者可以更高效地利用Service实现复杂的功能,同时确保应用的稳定性和性能。在实际开发中,务必注意Service的生命周期管理,避免不必要的资源浪费,提升...