Android Note - Service

作者: 肉丝汤 | 来源:发表于2016-04-07 00:08 被阅读90次

    Service是由framework层的ActivityServiceManager管理的生命周期长、运行于后台的服务性组件。Service本身是运行在当前应用进程的主线程中,但是可以在Service中开辟子线程以实现音乐播放、数据库交互、文件操作等耗时操作(因为绝大多数情况下Service没有前台界面)。需要在manifest文件中声明Service

    manifest中的部分参数配置说明

    • android:exported 是否允许被包名不同的应用调用。设为false时表示只能被当前应用或同一用户ID的应用启动或绑定
    • adnroid:name 服务相对于整个应用包的路径,可以填写完整路径,也可以只写Service的相对路径

    启动方式


    Service有两种启动方式,分别通过startService方法和bindService方法启动

    • startService
      通过这种方法启动的Service,在启动它的应用退出后,仍然会继续运行,除非服务自身调用stopSelf()或者外部接口调用stopService()方法才能停止服务;当服务停止时,系统会销毁服务
    • bindService
      通过这种方法启动的Service,是与启动他的应用绑定在一起的,即应用退出时,该服务也退出;如果要停止服务,需要调用unBindService()方法> 通过startService启动的服务可以被绑定,即通过bindService()方法与Activity绑定。此时如果需要关闭Service,需要先调用方法unBindService()然后stopService(),否则Service是不会被关闭的

    生命周期


    服务的生命周期

    服务的生命周期根据启动方式的不同而略有差异。如同Activity生命周期一样,在生命周期每个阶段,分别会发出不同的回调方法;与Activity不同之处是Service的回调方法中不需要实现基类的方法(super)

    • 通过onStartService()启动
      • 不论调用几次startService(),Service中onCreate()方法只调用一次,但是每次都会调用onStartCommand()
      • 当调用stopService() / stopSelf()时,如果此时Service未与任何组件绑定,会直接调用onDestroy()方法销毁服务
    onStartService
    • 通过onBindService()绑定
      • 不论调用几次bindService(),Service中onCreate()方法只调用一次,但是每次都会调用onBind()
      • 当调用unBindService()时,系统会回调一个onUnbind()回调方法,然后再销毁服务
    onBindService
    • 先通过onStartService()启动,再通过onBindService()绑定
      • 不论调用几次startService(),Service中onCreate()方法只调用一次,但是每次都会调用onStartCommand()
      • 当终止Service时,需要先unbindService(),再stopService()。如果先调用stopService()将不会停止Service
    **先通过onStartService()启动,再通过onBindService()绑定**

    附加参数


    onStartCommand() 提供一个返回值,告诉系统在onStartCommand()方法调用结束后Service被kill时如何重启Service。返回值有如下几种

    • START_STICKY 如果Service被kill,那么系统会在随后试图重新启动Service,但是不会继续使用前次传入的Intent对象
    • START_NOT_STICKY 如果Service被kill,系统不会试图重新启动Service
    • START_REDELIVER_INTENT 类似于START_STICKY,但是会重新传入Intent对象
    • START_STICKY_COMPATIBILITY START_STICKY的兼容版本,当START_STICKY不好使时可以试一下这个参数

    Foreground Service


    使用Foreground Service,使Service在内存回收中获得更高优先级,比后台Service更不容易被系统kill
    通过在Service的onStartCommand()回调方法中调用startForeground()方法,可以让Service在前台运行
    通过调用stopForeground()方法,可以让Service停止前台运行,但是Service本身不会被停止

    Remote Service


    当Service需要被其他应用调用时,该Service相对于其他应用而言是一个Remote Service(远程服务)。此时服务与应用分别处于不同的进程中,需要跨进程通信(IPC)。Android中采用AIDL(Android Interface Defination Language)协议进行跨进程通信

    参考资料


    Android中Service类onStartCommand
    Android Service的生命周期
    Android中Service的使用详解和注意点
    Android中Service(服务)详解
    使用startForeground让android服务前台运行


    相关文章

      网友评论

        本文标题:Android Note - Service

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