美文网首页常用汇总面试专栏
Android 进阶之 Service 难点

Android 进阶之 Service 难点

作者: Kevin_小飞象 | 来源:发表于2019-04-03 11:19 被阅读0次

    难点一: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。

    相关文章

      网友评论

        本文标题:Android 进阶之 Service 难点

        本文链接:https://www.haomeiwen.com/subject/eadabqtx.html