Android开发必备第三章Service

第三章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 它的内部使用HandlerThreadHandler避免了界面处理耗时操作时界面没有响应因为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绑定(这里是将一个activityservice绑定)

Ø 从这里我们可以看到需要返回一个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而且也实现了多线程异步的机制 。

QQ1207834821

     

 

猜你喜欢

转载自blog.csdn.net/zhangguangtao1207/article/details/9312439