Android基础 - Service生命周期(一)

Service简介

  • 四大组件之一,与Activity不同之处,没有UI界面,是在后台运行的组件。
  • 适合执行一些长期在后台运行和没有用户交互的任务。默认是在主线程运行,若要执行耗时操作,需放在开启子线程进行。

Service工作状态

  • 启动状态:主要用于执行后台计算
    • startService:启动服务
    • stopService:停止服务
  • 绑定状态:主要用于其他组件(Activity、Fragment)和Service的交互
    • bindService:绑定服务
    • unbindService:解绑服务

两者的区别:

  • 生命周期执行不同

    • startService:onCreate -> onStartCommand -> onDestroy
    • bindService: onCreate -> onBind -> onUnBind -> onDestroy
  • 使用场景有所不同

    • startService:一般用于功能单一、无需交互的场景,启动服务后,会长期在后台运行,即使启动所在的组件销毁了,服务也不会停止,需调用stopService才能停止服务,
    • bindService:一般用于组件与Service需要交互的场景,可以通过实现IBinder接口实例来获取Service对象,再通过Service对象获取需要的数据。

生命周期

这里写图片描述

左图显示了使用 startService() 所创建的服务的生命周期,右图显示了使用 bindService() 所创建的服务的生命周期。


public class MyService extends Service {

    public static final String TAG = "MyService";

    /**
     * service初次启动调用,在service没有销毁的情况下,再次触发startService()或者
     * bindService()是不会多次调用此函数。
     */
    @Override
    public void onCreate() {
        Log.i(TAG,"onCreate()");
        super.onCreate();
    }

    /**
     *  service初次创建与在service没有销毁的两种情况下,再次触发startService()
     * 会调用此函数。
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
      Log.i(TAG,"onStartCommand() -- "+Thread.currentThread());
        return super.onStartCommand(intent, flags, startId);
    }


    /**
     * 初次绑定service调用此函数,在没有销毁情况下,多次绑定是不会调用的。
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG,"onBind()");
        return mBinder;
    }


    /**
     * 解绑调用函数
     */
    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG,"onUnbind()");
        return super.onUnbind(intent);
    }


    /**
     * 销毁
     */
    @Override
    public void onDestroy() {
        Log.i(TAG,"onDestroy()");
        super.onDetroy();
    }


}

1、startService启动服务到销毁整个生命周期如下:
这里写图片描述
onStartCommand方法是在主线程执行的不能做耗时操作,若要做耗时操作必须创建一个子线程,onStartCommand被调用后,服务才会进入运行状态。

在服务启动后,如果再次触发startService方法,是不会调用onCreate,会直接调用onStartCommand方法。

2、bindService绑定服务到解绑的整个生命周期如下:
这里写图片描述

在绑定服务,如果再次触发bindService方法,不会进行重绑定操作,任何周期方法都不会被调用,
如果在组件中已经解绑服务了,再次触发unbindService方法,会报java.lang.IllegalArgumentException: Service not registered错误。

3、同时使用startService和bindService启动绑定服务的生命周期:
这里写图片描述

如果要销毁服务,必须同时调用stopService和unbindService方法才能关闭服务。

猜你喜欢

转载自blog.csdn.net/hzw2017/article/details/80891187