zoukankan      html  css  js  c++  java
  • 第三章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 它的内部使用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绑定(这里是将一个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

     

         

     

  • 相关阅读:
    1070 结绳
    1069 微博转发抽奖
    1068 万绿丛中一点红
    1067 试密码
    1066 图像过滤
    1065 单身狗
    CSS--文本溢出与换行
    css--滤镜filter
    css--flex布局
    css--table布局
  • 原文地址:https://www.cnblogs.com/zhangguangtao/p/3191161.html
Copyright © 2011-2022 走看看