AIDL在音乐播放器中的应用

一、AIDL简介
  由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想访问的话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。通过代码来实现这个数据传输过程是冗长,但是Android为开发者提供了AIDL工具来处理这项工作。
  AIDL (Android Interface Definition Language)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。AIDL IPC机制是面向接口的,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
  AIDL(AndRoid接口描述语言)是一种接口描述语言,编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象。
  AIDL定义一个接口,客户端(调用端)通过bindService来与远程服务端建立一个连接,在该连接建立时会将返回一个IBinder对象,该对象是服务端Binder的BinderProxy,在建立连接时,客户端通过asInterface函数将该BinderProxy对象包装成本地的Proxy,并将远程服务端的BinderProxy对象赋值给Proxy类的mRemote字段,就是通过mRemote执行远程方法调用。
二、AIDL适用的场景
  在官方文档中有提醒我们何时有必要使用AIDL:只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service,以及想在你的service处理多线程。具体不同场景下的AIDL设计规则如下:
  1如果不需要进行不同应用程序间的并发通信(IPC),通过实现一个Binder对象来创建接口;
  2或者你想进行IPC,但不需要处理多线程的,则使用Messenger对象来创建接口。
三、AIDL的开发步骤
1.创建AIDL文件
  Android需要AIDL定义远程接口。AIDL接口定义语言的语法很简单,它只是定义两个进程之间的通信接口。AIDL定义接口的源代码必须以.aidl结尾。AIDL接口中用到数据类型,除了基本类型、String、List、Map、CharSequence以外,其余的数据类型都需要导包,即使它们就在同一个包中也是需要导包的。开发人员定义的AIDL接口只是定义了进程之间的通信接口,Service端、客户端都需要使用AndroidSDK安装目录下的platform-tools子目录下的aidl.exe工具为该接口提供实现,如果开发者使用ADT工具进行开发,那么ADT工具会自动为该AIDL接口生成实现。

图1

如图1所示,我们在音乐播放器工程中的src的cn.XXX.service的包下创建IMediaPlaybackService.aidl和ITaskCallback.aidl。IMediaPlaybackService.aidl的代码如图2所示。

图2
  定义好上面的AIDL接口后,ADT工具会自动在gen目录下生成IMediaPlaybackService.java和ITaskCallback.java接口,如图3所示。在接口中会包含Stub内部类,如图4所示,该内部类实现了IMediaPlaybackService接口,可以作为Service的onBind()方法的返回值。

图3
 

图4
2.将接口暴露给客户端
  定义好AIDL接口之后,接下来就可以定义一个Service实现类了,如图5所示为定义的MediaPlaybackService,该Service的onBind()方法所返回的IBinder对象应该是ADT所生成的ICat.Stub的子类的实例,如图6所示为该Service的onBind()方法,图7是返回的IMediaPlaybackService.Stub的实例,其中IMediaPlaybackServiceStub继承IMediaPlaybackService.Stub,实现了IBinder接口。至于其他部分,和开发本地的Service一致。

图5

图6

图7
  该Service类开发完成之后,还需在AndroidManifest.xml文件中配置该Service。
3.客户端访问AIDLService
  AIDL接口定义了两个进程之间的通信接口,因此不仅服务器端需要AIDL接口,客户端同样需要定义的AIDL接口,因此开发客户端的第一步就是将Service端的AIDL接口文件复制到客户端应用中,复制到客户端后ADT工具会为AIDL接口生成相应的实现。
  客户端绑定远程Service与绑定本地Service的区别不大,同样只需要两步。创建ServiceConnection对象。以ServiceConnection对象作为参数,调用Context的bindService()方法绑定远程Service即可。
  与绑定本地Service不同的是,绑定远程Service的ServiceConnection并不能直接获取Service的onBind()方法所返回的对象,它只能返回onBind()方法所返回的对象的代理。
  在音乐播放器代码中自定义ServiceUtil类,通过bindToService()方法和unbindToService()方法,进行绑定和启动Service,以及解除绑定。如图8和图9所示。在Activity中启动Service,只需在onCreate()中添加:
mToken=ServiceUtil.bindToService(this);
解除绑定可在onDestroy()中添加:
ServiceUtil.unbindFromService(mToken);

图8
 

图9
四、音乐播放器的Service
  1.MediaPlaybackService.java实现了音乐播放器的所有Service实现方法。
  2.IMediaPlaybackService.aidl使用AIDLService机制实现客户端与Service之间通信。
  3.ITaskCallback.aidl是在线搜索歌曲的回调接口,只有语音助手使用。
  4.MediaPlayvbackServiceStub.java继承了IMediaPlaybackService.Stub,方便MediaPlaybackService进行实例化对象。
  5.ServiceUtil.java定义ServiceUtil类能实现客户端和MediaPlaybackService的通信。
五、音乐播放器的Activity同Service通信交互


图10 音乐播放器的Activity同Service通信交互
  1.Activity通过在onCreate()中调用ServiceUtil类的bindToService()方法启动或绑定MediaPlaybackService。
  2.在MediaPlaybackService的onBind()返回IBinder对象的IMediaPlaybackService.Stub的实例。
  3.Activity调用ServiceUtil类的方法,ServiceUtil通过继承自IMediaPlaybackService.Stub的sService实例实现同MediaPlaybackService的通信完成相应的命令。
  4.当MediaPlaybackService完成相应的任务,发送PLAYSTATE_CHANGED的广播,Activity通过registerReceiver接收广播。
  5.通过IMediaPlaybackService .Stub.asInterface(service)来得到sService对象。
六、总结
(1)接口名和aidl文件名相同。
(2)接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。
(3)AIDL默认支持的类型包括java基本类型(int,long,boolean等)和(String,List,Map,CharSequence),使用这些类型时不需要import声明。对于List和Map中包含的元素类型必须是AIDL支持的类型.如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。
(4)自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即使在同一个包中。
(5)在ServiceUtil中通过IMediaPlaybackService .Stub.asInterface(service)来得到sService对象,并通过sService实现同MediaPlaybackService的通信。

时间: 2024-10-18 17:13:43

AIDL在音乐播放器中的应用的相关文章

安卓音乐播放器中歌词同步问题

音乐文件是.lrc格式的,以一首歌曲为例, [ti:回忆的沙漏][ar:邓紫棋][al:G.E.M.][by:][offset:0][00:02.50]回忆的沙漏 - G.E.M. 邓紫棋[00:04.62]词:庭竹[00:05.72]曲:G.E.M.[00:15.03]拼图一片片失落[00:18.56]像枫叶的冷漠[00:21.87]墙上的钟[00:23.79]默默数着寂寞[00:29.30]咖啡飘散过香味[00:33.06]剩苦涩陪着我[00:36.68]想念的心[00:39.44]埋葬我在

android 在音乐播放器中设置一首歌曲为来电铃声,设置不起作用

AudioProfile,情景模式,多卡设置铃声 系统开启Multi_ringtone_support.进入菜单--音乐--歌曲列表--长按一首歌曲选择设为手机铃声,提示已成功设置,但是进入设置中情景模式查看,仍然是默认铃声.打电话后铃声还为默认铃声. 修改: AudioProfileService.java mRingtoneObserver = new ContentObserver(new Handler())函数里面的 case GENERAL: case OUTDOOR: if (mE

手把手教你做音乐播放器(八)桌面小工具(下)(完)

8.4 MusicService的改造 8.4.1 App widget触发MusicService 当App widget的按钮被点击后,会触发隐式定义的Intent发送给MusicService.例如当下一首按钮被点击后,携带action-MusicService.ACTION_PLAY_MUSIC_NEXT的Intent将触发MusicService的onStartCommand()函数. 我们可以在onStartCommand()函数当中接收到App widget要求的操作命令,进行相应

我的音乐播放器(2) 服务控制音乐的状态

package com.jk.impl; import android.widget.SeekBar; public interface IMusic { //暂停播放 public void dopause(); //继续播放 public void doresume(); //播放 public void dostart(); //停止播放 public void dostop(); //初始化SeekBar 和设置播放完成的回调方法 public void init(SeekBar see

Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)

1.回顾 上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识 2.重点 (1)Service 分类 (2)Service 的生命周期 (3)Service 标签 下的属性 (4)什么时候使用BindService 和 startService ? (5)实例 - 通过Service 服务 实现 音乐播放器 后台播放 3.Service 分类 3.1 按照地点分 (1)本地服务 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

web音乐播放器

今天闲暇时间,花了2小时,写了个简单音乐播放器.欢迎大家来吐糟 先看下界面截图 大体实现:播放,停止,上一曲,下一曲,循环播放功能. 知识点:1.html 中audio 2.css 位置fixed 其中audio用到的方法:1.play 2.pause ,属性:1.src 2.loop 对于audio不熟悉的移步到http://www.w3school.com.cn/jsref/dom_obj_audio.asp 其中数据部分是在网上找了的保存在listrings.js中 下边关键时刻代码来了