Android组件之Service(概述)

来源:互联网 发布:乐乎亚洲雄风的喜欢 编辑:程序博客网 时间:2024/04/28 18:21

Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。

service组件作为服务端可以和client端运行在相同进程,也可以运行在不同进程内.

service运行在进程的主线程内,在处理业务逻辑时最好使用异步任务或新建线程。

如果service和client组件运行在相同进程内:

1) client可以通过startService()的方式启动,并在service的onStartCommand()回调函数中实现业务逻辑,业务完成后需要在client组件中调用stopService()或者在service自身内调用stopSelf()方法停止service.

2) client也可以通过bindService()的方式启动service, 在service里面实现LocalBinder继承Binder,在service的onBind()方法中返回LocalBinder对象。

在client的onServiceConnected()回调中获取service的LocalBinder对象,并调用LocalBinder的getService()方法直接获取service的实例,然后通过service实例直接调用service中实现业务逻辑的方法. 


如果service和client组件运行在不同进程内:

1)client可以通过startService()的方式启动,并在service的onStartCommand()回调函数中实现业务逻辑,业务完成后需要在client组件中调用stopService()或者在service自身内调用stopSelf()方法停止service.

2)client也可以通过bindService()的方式启动service,client绑定了其他进程的service组件后,有两种方式与service交互

  方式一: 通过Messenger

  1. service实现一个Handler,并在其handleMessage()方法中实现client端的调用
  2. service在onBind()方法中返回Messenger的IBinder对象
  3. client在onServiceConnected()方法里面获取service端Messenger的IBinder代理对象,并用这个IBinder代理对象创建client端的Messenger对象.
  4. client端用Messenger对象发送消息给service.

  方式二: 通过AIDL

  1. 在aidl文件里面定义需要实现的接口

  2. service通过mBinder = new IxxxxService.Stub()的方式实现aidl文件中定义的接口,注意,这个stub是binder的子类,他实现了aidl文件中定义的接口,也就是说业务逻辑都在这个stub类里面实现.

  3. service通过onBind()方法返回mBinder,也就是返回stub类.

  4. client通过onServiceConnected()方法获取service对应stub类的代理对象BinderProxy.并用该BinderProxy对象创建service的远程代理对象xxxxServiceProxy, 并把BinderProxy 对象作用xxxxServiceProxy的参数mRemote.

  5. client用xxxxServiceProxy直接调用位于stub中的实现业务逻辑的方法.

下面是一个aidl的简单例子:

1.定义aidl文件:IPCTest.aidl

package android.xutao.test;interface IIpcTestService {    int test();}
aidl文件编译之后会自动生成一个中间文件IPCTest.java,该文件包含binder进程间通信所需要的java code.

2. service端:

public class IpcTestService extends Service {    private final IIpcTestService.Stub mBinder = new IIpcTestService.Stub() {            int test();    };    @Override    public IBinder onBind(Intent intent) {        return mBinder;    }}
3. client端
1) 定义ServiceConnection:

private ServiceConnection mServiceConnection = new ServiceConnection() {    public void onServiceConnected(ComponentName className, IBinder service) {        mIpcTestService = IIpcTestService.Stub.asInterface(service);    }    public void onServiceDisconnected(ComponentName className) {    }};
2) 定义Intent

mIntent = new Intent(getContext(), IpcTestService.class);
3) 绑定,解绑服务

getContext().bindService(mIntent, mServiceConnection, 0);getContext().unbindService(mServiceConnection);

方式一

通过onServiceConnected()回调方法获取Messager的binder代理对象,并用该代理对象向Messager发送消息.

client端的任务请求都放在消息队列中,service挨个处理每个请求.不用做多线程处理,比较简单.

方式二

通过onServiceConnected()回调方法获取service对应Stub类型的binder代理对象,并用该binder代理对象创建service的远程代理对象,通过service的远程代理对象可以直接调用service内Stub的方法.

多个client端可以同时请求服务,所以service需要考虑多线程问题.


生命周期


0 0