Android 进阶之 Service 难点

难点一:Service 的 start 和 bind 状态有什么区别?

开启Service有两种不同的方式:startService和bindService。
startService 有独立的生命周期,不依赖该组件。多次调用 startService,onCreate只有第一次会被执行,而onStartCommand会执行多次。结束服务时,调用 stopService,生命周期执行onDestroy 方法,并且多次调用 stopService 时,onDestroy 只有第一次会被执行。

bingService开启服务时,根据生命周期里onBind方法的返回值是否为空,有两种情况。
1、onBind返回值是null;
调用bindService开启服务,生命周期执行的方法依次是:
onCreate() ==> onBind();
调用多次bindService,onCreate和onBind也只在第一次会被执行。
调用unbindService结束服务,生命周期执行onDestroy方法,并且unbindService方法只能调用一次,多次调用应用会抛出异常。使用时也要注意调用unbindService一定要确保服务已经开启,否则应用会抛出异常。
2、onBind返回值不为null;
这时候调用bindService开启服务,生命周期执行的方法依次是:
onCreate() ==> onBind() ==> onServiceConnected();
调用多次bindService,onCreate和onBind都只在第一次会被执行,onServiceConnected会执行多次。
调用unbindService结束服务和上面相同,unbindService只能调用一次,onDestroy也只执行一次,多次调用会抛出异常。

startService和bindService开启服务时,他们与activity之间的关系。
1、startService开启服务以后,与activity就没有关联,不受影响,独立运行。
2、bindService开启服务以后,与activity存在关联,退出activity时必须调用unbindService方法,否则会报ServiceConnection泄漏的错误。

注意:同一个服务可以用两种方式一同开启,没有先后顺序的要求。

难点二:同一个 Service,先 startService,然后再 bindService,如何把它停止掉?

不论被 startService 调用几次,只需 stopService() 一次;
调用 n 次 bindService() ,必须调用 n 次 unbindService() 方法。
因此,需要调用一次 stopService() 和 n 次 unbindService() 方法,执行顺序没有要求,最后一个stopService() 或 unbindService() 方法会导致 Service 的 onDestroy() 执行。

难点三:Service 的 onStartCommand 方法的返回值?不同返回值有什么区别?

一共有如下四种返回值:

    /**
     * 为了兼容版本,在 Service 被杀死后,并不保证 onStartCommand() 会被再一次调用。
     */
    public static final int START_STICKY_COMPATIBILITY = 0;
    /**
     * 在 Service 被杀死后,保留启动状态,但不包存 intent,之后系统会尝试重启该 Service ,并重新回调 onStartCommand()
     */
    public static final int START_STICKY = 1;

    /**  
     * 常规操作,除非死之前还有组件调用 startService ,否则系统不会保留启动状态并重启该 Service。
     */
    public static final int START_NOT_STICKY = 2;

    /**
     * Service 被杀死后,系统将会组织一次Service 重启,被杀死前最后一次传递的 intent 将重新被执行。
     */
    public static final int START_REDELIVER_INTENT = 3;

难点四:Service 的生命周期方法 onCreate、onStart、onBind 等运行在哪个线程?

Service 默认是运行在 UI 线程的,其生命周期的方法也是运行在 UI 线程中。因此想在Service中执行耗时操作,必须另起线程,否则可能会产生 ANR。

发布了225 篇原创文章 · 获赞 64 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/duoduo_11011/article/details/103931706