第三章Service
Service深入介绍
1:本地服务
Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。
Ø 本地服务的生命周期
context.startService()启动一个服务就会调用该服务的onCreate()的方法 接着调用onStart()方法(注:该方法已过时新的方法是onstartCommand)服务开始运行如果此时在调用startService()该服务不会去调用onCreate()方法会再次调用onStart方法。如果调用context.stopService() 该服务就会调用onDestroy方法
注:在使用服务中一般要为服务设置个线程用于异步的处理 而android 框架为我们提供了一个IntentService 它的内部使用HandlerThread和Handler避免了界面处理耗时操作时界面没有响应因为IntentService采用单独的线程每次只从队列中拿出一个请求进行处理
2:远程服务
Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
Ø 远程服务的生命周期
context.bindService()可以启动一个远程服务并且该服务和该content绑定在一起如果该content消亡了那么他们之间的绑定关系也就结束了该服务也会消亡。使用bindService()方法启动服务该服务会调用onCreate方法接着就会去调用onBind方法 那该服务就在运行没有调用onStart方法 如果context消亡或者掉用context .onUnbind方法那么服务就会调用onDestroy方法结束服务
context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
注:在绑定服务的时候,需要一个服务连接对象,ServiceConnection,服务一旦连接,就会调用onServiceConnected方法,我们可以在这个方法里面返回我们的本地服务对象,具体看代码;而在服务断开时候会调用onServiceDisconnected方法,我们可以清理一些服务资源。
3:概要
1. 使用startService()启动service (机制分析)
Ø 这种方式跟启动一个activity是一样的原理
Ø 创建一个类实现Service (ServiceModel extends Service) 复写int
onStartCommand(Intent intent, int flags, int startId)(其他的方法可以选择复写)
Ø 注册service(<service android:name=".ServiceModel"></service>)
Ø 驱动此service 机制分析:当驱动startService()时,系统会回调一个
onStartCommand方法,然后你可以在此方法里做你需要做的操作
2. 使用bindService()启动service(机制分析)
Ø 将应用程序和service绑定(这里是将一个activity和service绑定)
Ø 从这里我们可以看到需要返回一个IBinder对象 IBinder onBind(Intent intent) 在API中我们可以发现这个是一个接口,
实现了这个接口的类叫Binder在此我们自定义一个类来继承此类如下:
01.public class LocalBinder extends Binder {
02.public ServiceModel getService() {
03. return ServiceModel.this;
04. }
05. }
06.//该类的目的是 :返回了一个service对象
Ø 这里主要满足这个bindService函数。这个函数需要的是一个Intent对象,一个ServiceConnection对象,
以及一个flag 这里主要 谈一下第二个参数
当我们的service中的onBind方法返回的时候如果连接上了会调用这个ServiceConnection里面的onServiceConnected这个方法,
在这个方法里的第二个参数就是onBind()返回的那个IBinder对象.
而这个对象中我们有创建了一个方法getService() 用来获得这个service对象所以可以在activity中操作这个service了,
完成了绑定!
01.bindService.setOnClickListener(new OnClickListener() {
02. public void onClick(View v) {
03. Intent intent = new Intent();
04. intent.setClass(ServiceTest.this, ServiceModel.class);
05. bindService(intent, conn = new ServiceConnection(){
06. public void onServiceConnected(ComponentName name,
07. IBinder service) {
08. Log.i(TAG , "---onServiceConnected---");
09. ServiceModel model =((ServiceModel.LocalBinder) service).getService();
10. model.model_methed();
11. }
12. public void onServiceDisconnected(ComponentName name) {
13. }}, BIND_AUTO_CREATE);
14. }
15. });
Ø 机制分析:通过IBinder onBind(Intent intent) 返回的IBinder ,
与ServiceConnection中的onServiceConnected返回的service相对应来完成service的绑定操作
3. 两者的区别
Ø 前者与应用程序无关,也就是说前者的应用程序的关闭与否与service无
关。而后者与应用程序共存亡(onServiceDisconnected)。
4. 注意事项
Ø 在service里面不要进行非常耗时的操作,因为系统会调用几秒钟后就返
回了。 这时可以考虑使用单独开其他的线程,或者使用API中定义的
IntentService这个类是继承了service而且也实现了多线程异步的机制 。
QQ:1207834821