android service 学习(下)
2011-04-15 14:44
369 查看
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事。
AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件
viewsourceprint?
如果你正在使用eclipse的Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:
viewsourceprint?
当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
viewsourceprint?
启动后的界面如下
[源码下载]
AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件
1 | package org.allin.android.remote; |
2 | interface IMusicControlService{ |
3 | void play(); |
4 | void stop(); |
5 | void pause(); |
6 | } |
01 | /** |
02 | *@authorallin.dev |
03 | * |
04 | * |
05 | */ |
06 | public class RemoteMusicService extends Service{ |
07 |
08 | private static final StringTAG= "RemoteMusicService" ; |
09 | private MediaPlayermediaPlayer; |
10 |
11 | /* |
12 | *(non-Javadoc) |
13 | * |
14 | *@seeandroid.app.Service#onBind(android.content.Intent) |
15 | */ |
16 | @Override |
17 | public IBinderonBind(Intentintent){ |
18 | return binder; |
19 | } |
20 |
21 | private final IMusicControlServic<SCRIPTtype=text/javascript><!--mce: 1 --></SCRIPT>e.Stubbinder= new IMusicControlService.Stub(){ |
22 |
23 | @Override |
24 | public void stop() throws RemoteException{ |
25 | Log.d(TAG, "stop...." ); |
26 | if (mediaPlayer!= null ){ |
27 | mediaPlayer.stop(); |
28 | try { |
29 | //在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数 |
30 | mediaPlayer.prepare(); |
31 | } catch (IOExceptionex){ |
32 | ex.printStackTrace(); |
33 | } |
34 | } |
35 |
36 | } |
37 |
38 | @Override |
39 | public void play() throws RemoteException{ |
40 | Log.d(TAG, "play...." ); |
41 | if (mediaPlayer== null ){ |
42 | mediaPlayer=MediaPlayer.create(RemoteMusicService. this , |
43 | R.raw.tmp); |
44 | mediaPlayer.setLooping( false ); |
45 | } |
46 | if (!mediaPlayer.isPlaying()){ |
47 | mediaPlayer.start(); |
48 | } |
49 | } |
50 |
51 | @Override |
52 | public void pause() throws RemoteException{ |
53 | Log.d(TAG, "pause...." ); |
54 |
55 | if (mediaPlayer!= null &&mediaPlayer.isPlaying()){ |
56 | mediaPlayer.pause(); |
57 | } |
58 | } |
59 |
60 | }; |
61 |
62 |
63 | @Override |
64 | public void onDestroy(){ |
65 | super .onDestroy(); |
66 |
67 | Log.d(TAG, "onDestroy" ); |
68 | if (mediaPlayer!= null ){ |
69 | mediaPlayer.stop(); |
70 | mediaPlayer.release(); |
71 | } |
72 | } |
73 | } |
01 | private ServiceConnectionsc= new ServiceConnection(){ |
02 |
03 | @Override |
04 | public void onServiceDisconnected(ComponentNamename){ |
05 | musicService= null ; |
06 | Log.d(TAG, "inonServiceDisconnected" ); |
07 | } |
08 |
09 | @Override |
10 | public void onServiceConnected(ComponentNamename,IBinderservice){ |
11 | musicService=IMusicControlService.Stub.asInterface(service); |
12 | Log.d(TAG, "inonServiceConnected" ); |
13 | } |
14 | }; |
[
相关文章推荐
- Android开发学习笔记:Service的远程调用
- Android 初步学习BroadCast与Service实现简单的音乐播放器
- Android Service学习之AIDL, Parcelable和远程服务
- Android Service的学习和总结
- Android 学习笔记 Service (一) Local Service
- Android学习(十四) Service组件
- Android 四大组件学习之 Service 服务
- Android学习之IntentService
- android service 学习(上)
- Android Service学习之AIDL, Parcelable和远程服务
- 一个简单的demo学习Android远程Service(AIDL的使用)
- Android 学习笔记 Service服务与远程通信...(AIDL)
- Android学习日志11__四大组件02__service
- Android Service学习总结(上)
- Android之Service学习笔记
- Android知识点学习笔记——Service服务
- android service 学习笔记
- android service 学习
- 菜鸟学习之Android Service组件
- android基础学习之service的启动和关闭细解