Android SDK
提供了两种类型的
Service
,用于类似
*nix
守护进程或者
windows
的服务
1.
本地服务
Local Service
:用于应用程序内部
2.
远程服务
Remote Service
:用于
android
系统内部的应用程序之间
前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程式比如
Activity
所属线程,而是单开线程后台执行,这样用户体验比较好。
后者可被其他应用程序服用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。
不需要和
Activitye
交互的本地服务
本地服务编写比较简单。首先,要创建一个
Service
类,该类继承
android
的
Service
类。然后在
Activity
中的
onCreate
和
onDestory
中分别执行以下语句开启服务和停止服务。
this
.startService(
new
Intent(
this
, ServiceImpl.
class
));
this
.stopService(
new
Intent(
this
, ServiceImpl.
class
));
需要和
Activity
交互的远程服务
上面的示例是通过
startService
和
stopService
启动关闭服务的。适用于服务和
activity
之间没有调用交互的情况。如果之间需要传递参数或者方法调用。需要使用
bind
和
unbind
方法。
具体做法是,服务类需要增加接口,比如
ServiceInterface
,另外,服务类需要有一个内部类,这样可以方便访问外部类的封装数据,这个内部类需要继承
Binder
类并实现
ServiceInterface
接口。还有,就是要实现
Service
的
onBind
方法,不能只传回一个
null
了。
在
android
的
musicplayer
源码中
MediaPlaybackService
使用了以上的服务方式,针对该源码进行分析:
首先需要了解进程间通信、需要
AIDL
(以及
Binder
)
关于
AIDL
的介绍在文档:
docs/guide/developing/tools/aidl.html
关于
IBinder
的介绍在文档:
docs/reference/android/os/IBinder.html
以及
Binder
:
docs/reference/android/os/Binder.html
manifest
中
Service
的语法,见
docs/guide/topics/manifest /service-element.html
以上转自
http://blog.csdn.net/saintswordsman/archive/2010/01/05/5130947.aspx
步骤一:建立
aidl
文件
通过
aidl.exe
会在
gen
中生成该
service
类,该类中的成员变量
stub
实现了以下功能:
extends
Binder
implements
ServiceInterface,源码如下
interface IMediaPlaybackService
{
void openfile(String path);
void openfileAsync(String path);
void open(in int [] list, int position);
...................//接口方法
}
public interface IMediaPlaybackService extends android.os.IInterface {
/**生成binder类 */
public static abstract class Stub extends android.os.Binder implements
com.android.mymusic.IMediaPlaybackService {
private static final java.lang.String DESCRIPTOR = "com.android.mymusic.IMediaPlaybackService";
/** Construct the stub at attach it to the interface. */
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
...................
...................
...................//binder 方法
}
public void openfile(java.lang.String path)
throws android.os.RemoteException;
...................
...................//接口方法
...................
}
步骤二:编写服务的实现类
MediaPlaybackService
public class MediaPlaybackService extends Service {
......
@Override
public IBinder onBind(Intent intent) {
mDelayedStopHandler.removeCallbacksAndMessages(null);
mServiceInUse = true;
return mBinder;
}
private final IMediaPlaybackService.Stub mBinder = new IMediaPlaybackService.Stub()
{
...................//实现接口方法
};
}
步骤三:编写一个消费这个服务的
Activity
:
MediaPlaybackActivity:
(除此之外还有其他类)
public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
View.OnTouchListener, View.OnLongClickListener
{
private IMediaPlaybackService mService = null;
@Override
public void onStart() {
super.onStart();
...................//其他代码
if (false == MusicUtils.bindToService(this, serviecConnection)) {
// something went wrong
...................//其他代码
}
private ServiceConnection serviecConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName classname, IBinder obj) {
mService = IMediaPlaybackService.Stub.asInterface(obj);
if (MusicUtils.sService == null) {
MusicUtils.sService = mService;
...................//其他代码
}
}
public void onServiceDisconnected(ComponentName classname) {
}
};
}
//MusicUtils类:定义了播放器所需要的操作以及service和Activity之间的相互作用的操作
public class MusicUtils {
...................//其他代码
public static boolean bindToService(Context context, ServiceConnection callback) {
context.startService(new Intent(context, MediaPlaybackService.class));
ServiceBinder sb = new ServiceBinder(callback);
sConnectionMap.put(context, sb);
return context.bindService((new Intent()).setClass(context,
MediaPlaybackService.class), sb, 0);
}
...................//其他代码
}
需要注意:
远程服务往往不只是传递
java
基本数据类型。这时需要注意
android
的一些限制和规定:
以下转自
http://yangguangfu.iteye.com/blog/699306
1.
android
支持
String
和
CharSequence
2.
如果需要在
aidl
中使用其他
aidl
接口类型,需要
import
,即使是在相同包结构下;
3.
android
允许传递实现
Parcelable
接口的类,需要
import
;
4.
android
支持集合接口类型
List
和
Map
,但是有一些限制,元素必须是基本型或者上述三种情况,不需要
import
集合接口类,但是需要对元素涉及到的类型
import
;
非基本数据类型,也不是
String
和
CharSequence
类型的,需要有方向指示,包括
in
、
out
和
inout
,
in
表示由客户端设置,
out
表示由服务端设置,
inout
是两者均可设置。
分享到:
相关推荐
Android的媒体播放器就是一个典型的使用Binder的例子。媒体播放器被分为两个部分:媒体播放应用(Java程序+部分C++代码)和媒体播放服务(MediaServer,C++代码,依赖于外部模块opencore)。这两个部分分别运行在...
本项目“Music Player Service”是针对Android平台设计的一个音乐播放器,它深入展示了如何利用Service组件来实现音乐播放功能。下面我们将详细探讨这个项目的知识点。 1. **Android Service**: - Service是...
【Android MusicPlayer音乐播放器源码】是一款专为Android平台设计的音乐播放应用程序,它提供了丰富的功能,包括播放、暂停、上一首、下一首、音量控制、播放列表管理等。通过深入研究这个源码,我们可以了解到...
### Android底层源码分析_Binder #### 总体概述 Binder是Android系统中实现进程间通信(IPC)的核心机制之一。其设计模式基于客户端-服务器(Client-Server)架构,其中提供服务的一方称为Server进程,请求服务的...
在解压后的`Android源码——MusicPlayer音乐播放器源码.rar`中,你会看到Android工程的典型布局,包括`src`目录(存放Java源代码)、`res`目录(包含各种资源如XML布局、图片等)、`AndroidManifest.xml`(应用配置...
《Android Binder架构解析》这本书是深入理解Android系统服务通信机制的重要参考资料。Binder是Android系统中的核心组件,它作为进程间通信(IPC)的主要方式,连接了Android系统的各个部分,包括应用程序、服务、...
《Android音乐播放器(晴天...通过分析和学习“晴天播放”这款Android音乐播放器源码,开发者不仅可以掌握Android多媒体开发的基本技能,还能了解到服务、广播接收器等高级特性,为今后的Android应用开发打下坚实基础。
1. 添加依赖:将atlassian-xmlrpc-binder-0.9.jar引入到项目的类路径中,如果是Maven项目,可以在pom.xml文件中添加对应的依赖。 2. 创建XML-RPC客户端:通过Binder创建XML-RPC客户端实例,指定服务器地址和端口。 3...
1. 创建一个新的Service类,继承自Android的Service基类。 2. 在Service类中重写onCreate()方法,初始化Service所需的资源。 3. 重写onStartCommand()方法,处理来自客户端的startService()请求,执行相应的服务操作...
在Android应用开发中,`Service`和`Activity`是两个重要的组件。`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如...
这个源码分析将深入探讨Music应用的核心组件、架构设计以及关键功能的实现,帮助开发者理解如何在Android平台上构建一个高效且功能丰富的音乐播放器。 一、Music应用的架构 1. 用户界面(UI):Music应用使用...
1. Service Manager 成为 Binder 守护进程之路 2. Server 和 Client 获得 Service Manager 接口之路 3. Server 启动过程源代码分析 4. Client 获得 Server 远程接口过程源代码分析 5. 应用程序框架层的 Java 接口源...
1. 通过Binder:Service可以在onBind()方法中返回一个实现了IBinder接口的对象,客户端可以通过这个对象与Service进行数据交换。 2. 通过Intent:使用startService()发送Intent传递数据,Service在onStartCommand()...
recyclerview-binder Android Library for RecyclerView to manage order of items and multiple view types. Features Insert any items to wherever you want without calculating their position. Insert any...
"Android Binder C/C++层实现示例"提供了一个实践性的学习资源,帮助开发者深入理解Binder机制的底层实现,包括Client和Server的交互、Parcel数据封装、Service Manager的使用等核心概念,从而提升对Android系统内核...
通过分析Wind音乐播放器的源码,可以深入理解Android应用的开发流程,学习如何结合四大组件、多媒体API以及数据存储等技术来构建一个功能齐全的音乐播放应用。这对于进行Android毕业设计和论文撰写,乃至整个移动...
Atlassian-xmlrpc-binder-0.8.2.jar.zip是Atlassian提供的一款用于处理XML-RPC(远程过程调用)的绑定库,它主要服务于Java开发者,为他们提供了一个方便的接口来实现XML-RPC协议。此版本0.8.2代表了该库的一个稳定...