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需要考虑多线程问题.
生命周期
- Android组件之Service(概述)
- Android四大组件之- Service概述
- android四大组件之Service服务之总体概述
- android组件之Service
- Android之Service组件
- Android组件之 Service
- Android组件之Service
- android组件之service
- Android组件之Service
- Android组件之Service
- android组件之Service
- 关于android组件 service概述和用法
- Android四大组件之 Service
- Android四大组件之 Service
- Android四大组件之 Service
- android四大组件之Service
- android四大组件之Service
- android四大组件之Service
- Win7 系统常见问题解决方法
- codevs 卡片游戏
- AndroidStudio多渠道打包详细讲解
- iOS 使用某个第三方相册多选时,拖到自己项目里面,编译报错VOKMultiImagePicker-iOS
- Xcode更新替换appleID
- Android组件之Service(概述)
- BVT
- 性能调优攻略
- Android之App启动时间的统计方法
- content命令分析
- 第二次实验
- 蓝桥杯第四届 高斯日记(excel)
- iOS音频格式之AMR和WAV互转(更新支持64位)
- cf463d