首页 > 代码库 > Android四大组件之Service

Android四大组件之Service

        Android赋予Service比处于非活动状态的Activity更高的优先级,当系统请求资源时她们被终止的可能性更小。如果在运行时过早地终止了一个已经启动的Service,只要有足够的资源可用,则运行时会重新启动它。为了应对一些终止Service会显著影响用户体验的极端情况(如音乐播放器),必要时Service的优先级可以升级到和前台的Activity一样高。

        虽然Service没有专门的GUI,但它们还是运行在应用程序的主线程中。

一、创建和控制Service

    1. Service创建

  •  创建集成自Service的类并重写onCreate和onBind方法
  •  将该Service在Manifest文件中进行注册。

    2. 执行Service并控制它的重新启动

        重写onStartCommand事件处理程序以执行一个由Service封装的任务。在这个处理程序中可以指定Service的重新启动行为。当一个Service通过onStartService启动时就会调用onStartCommand方法,该方法在Service的生命周期内会执行多次。

        public int onStartCommand (Intent intent, int flags, int startId) {

        ......

        return Service.START_STICKY;

        }

        返回值控制当Service被运行时终止后系统如何响应Service的重新启动。

  •  START_STICKY                       重新启动的标准行为,运行时终止Service后重新启动调用onStartCommand,但传入的Intent为null,多用于处理自身状态的Service以及通过startService和stopService显示地启动和终止的Service。
  •  START_NOT_STICKY               Service被运行时终止后只有当存在未处理的启动调用时设为这个模式的Service才会重新启动。终止Service后若没有进行startService调用则Service会停止运行。多用于定期更新或网络轮询。
  • START_REDELIVER_INTENT     前两种模式的组合,当Service被运行时终止后,只有当存在未处理的启动调用或者进行在调用stopSelf之前被终止时才会重新启动Service,在后一种情况中将会调用onStartCommand但并不会传入没有正常处理完成的Intent.

    3.启动和停止Service

        启动Service:通过Intent显示或隐示启动   startService(intent)

        停止Service:stopService(intent)

        自终止Service:Service完成操作或处理后调用stopSelf来终止它。可以不传递参数也可以传递一个startId值保证已经为目前调用的每个startService实例完成了处理。

    4.将Service绑定到Activity

        Service和Activity绑定后Activity会维护对Service实例的引用,对Service进行方法调用。

        Service支持绑定需要实现onBind方法并且返回绑定Service的当前实例。

        要将Service和其他组件进行绑定,需要实现一个新的ServiceConnection。建立连接之后可以通过重写onServiceConnected和onServiceDisconnected得到对Service实例的引用。

        要执行绑定需要在Activity中调用bindServide并传递给他一个要绑定的Service的Intet以及一个ServiceConnection实例。

        Service和应用程序绑定时的标志位

  •  BIND_ADJUST_WITH_ACTIVITY                 系统可根据所绑定的Activity的重要程度来调整Service的优先级
  •  BIND_IMPORTANT和BIND_ABOVE_CLIENT  当客户端处于前台时,Service也应该变为前台进程。BIND_ABOVE_CLIENT指在内存极低的情况下运行时会先终止Activity再终止Service
  • BIND_NOT_FOREGROUND                          Service永远不会拥有前台的优先级
  • BIND_WAIVE_PRIORITY                             绑定指定的Service不应该改变Service的优先级

    5.创建前台Service

        通过Service的startForeground方法可以设置Service在前台运行,但是由于其会与用户交互,所以需要指定一个持续工作的Notification,只要Service在前台运行,这个通知就会显示。当Service不再需要前台运行的优先级时可以通过stopForeground将其移到后台。

Android四大组件之Service