zoukankan      html  css  js  c++  java
  • service的生命周期

    Managing the Lifecycle of a Service

      service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径:

    A started service

      被开启的service通过其他组件调用 startService()被创建。

      这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。

      当service被停止时,系统会销毁它。

    A bound service

      被绑定的service是当其他组件(一个客户)调用bindService()来创建的。

      客户可以通过一个IBinder接口和service进行通信。

      客户可以通过 unbindService()方法来关闭这种连接。

      一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。

      这两条路径并不是完全分开的。

      即是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。

      比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。

    Implementing the lifecycle callbacks

      和activity一样,service也有一系列的生命周期回调函数,你可以实现它们来监测service状态的变化,并且在适当的时候执行适当的工作。

      下面的service展示了每一个生命周期的方法:

    复制代码
    public class ExampleService extends Service
    {
        int mStartMode; // indicates how to behave if the service is killed
        IBinder mBinder; // interface for clients that bind
        boolean mAllowRebind; // indicates whether onRebind should be used
    
        @Override
        public void onCreate()
        {
            // The service is being created
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            // The service is starting, due to a call to startService()
            return mStartMode;
        }
    
        @Override
        public IBinder onBind(Intent intent)
        {
            // A client is binding to the service with bindService()
            return mBinder;
        }
    
        @Override
        public boolean onUnbind(Intent intent)
        {
            // All clients have unbound with unbindService()
            return mAllowRebind;
        }
    
        @Override
        public void onRebind(Intent intent)
        {
            // A client is binding to the service with bindService(),
            // after onUnbind() has already been called
        }
    
        @Override
        public void onDestroy()
        {
            // The service is no longer used and is being destroyed
        }
    }
    复制代码

      不像是activity的生命周期回调函数,你不需要调用基类的实现。

     

      这个图说明了service典型的回调方法,尽管这个图中将开启的service和绑定的service分开,但是你需要记住,任何service都潜在地允许绑定。

      所以,一个被开启的service仍然可能被绑定。

      实现这些方法,你可以看到两层嵌套的service的生命周期:

    The entire lifetime

      service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。

      和activity一样,service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。

      比如,一个音乐播放service可以在onCreate()中创建播放音乐的线程,在onDestory()中停止这个线程。

       onCreate() 和 onDestroy()会被所有的service调用,不论service是通过startService()还是bindService()建立。

    The active lifetime

      service积极活动的生命时间(active lifetime)是从onStartCommand() onBind()被调用开始,它们各自处理由startService()或 bindService()方法传过来的Intent对象。

      如果service是被开启的,那么它的活动生命周期和整个生命周期一同结束。

      如果service是被绑定的,它们它的活动生命周期是在onUnbind()方法返回后结束。

      注意:尽管一个被开启的service是通过调用 stopSelf() 或 stopService()来停止的,没有一个对应的回调函数与之对应,即没有onStop()回调方法。所以,当调用了停止的方法,除非这个service和客户组件绑定,否则系统将会直接销毁它,onDestory()方法会被调用,并且是这个时候唯一会被调用的回调方法。

    Managing the Lifecycle of a Bound Service

      当绑定service和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。

      因此,如果你的service是一个纯粹的绑定service,那么你不需要管理它的生命周期。

      然而,如果你选择实现onStartCommand()回调方法,那么你必须显式地停止service,因为service此时被看做是开启的。

      这种情况下,service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。

      另外,如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。

      onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。

      下图展示了这种service(被开启,还允许绑定)的生命周期:

     


    使用context.startService() 启动Service

    其生命周期为context.startService() ->onCreate()- >onStart()->Service running-->context.stopService() | ->onDestroy() ->Service stop 如果Service还没有运行,则android先调用onCreate()然后调用onStart(); 如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
    stopService的时候直接onDestroy, 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。 该Service的调用者再启动起来后可以通过stopService关闭Service。
    所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy
    对于bindService()启动Service会经历: context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop
    onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。 这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了, Srevice就会调用onUnbind->onDestroy相应退出。
    所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。 一但销毁activity它就结束,如果按home把它放到后台,那他就不退出。


    补充: 在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用), 其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/bigben0123/p/4332217.html
Copyright © 2011-2022 走看看