• Android Service 基础


    启动方式

    1. startService(Intent) 这种方式启动的Service可以在后台无限期的运行,与启动它的组件没有关系。
    2. bindService 绑定Service。它提供了一种类似C/S结构的接口,允许组件与Service进行交互,发送请求,获取结果,可以实现IPC跨进程操作。一个客户端组件绑定之后,Service开始运行;所有组件解绑之后,Service停止运行。

    这两种方式可以同时存在于一个Service中。

    服务在其托管进程的主线程中运行,它既 不创建 自己的线程,也 不会 在单独的进程中运行。可以通过Manifest文件对其运行的进程进行配置。

    重要的回调方法

    OnStartCommand()

    startService() 之后调用的方法。一旦执行此方法,服务即会启动并在后台运行。可以使用stopSelf()或者stopService()方法终止Service。

    onBind()

    bindService()时,系统将调用此方法。此方法实现中必须返回一个IBinder接口的实例,用来给客户端与Service通信。如果不允许绑定,则应该返回null。

    onCreate()

    首次创建服务的时候调用此方法。如果服务已经运行,那不会调用此方法。

    onDestroy()

    服务正常销毁的时候调用此方法。

    如果将服务绑定到焦点Activity那它不太可能会被终止;如果将服务声明为前台服务,那它几乎不会被终止。

    扩展Service

    Service

    它是所有服务的基类。
    onStartCommand()方法返回值必须是以下常量:

    1. START_NOT_STICKY Service在终止之后,不会自动重启。
    2. START_STICKY Service在终止之后,会自动重启。系统会调用Intent为null的onStartCommand来启动服务。如果有排队的Intent等待服务,那么他们会依次调用onStartCommand方法传递进来。
    3. START_REDELIVER_INTENT Service在终止之后,会自动启动。系统使用最后传进来的Intent,重新调用onStartCommand方法启动服务。
      这里的三个返回值只针对startService()启动的Service,对bindService()启动的Service无效。

    IntentService

    可以使用工作线程逐一处理所有启动请求。不要求服务同时处理多个请求的时候,它是个不错的选择。

    扩展它的时候只需要实现onHandleIntent()方法就可以了。

    终止Service

    调用stopSelf()自行停止运行;另一个组件调用stopService()来停止它。一旦调用stopService(),系统会 尽快 停止它。

    可以在stopSelf()的时候加一个Id。这个Id是onStartCommand()的时候传进来的Id。由于startService()可能被调用多次所以这个onStartCommand()传进来的Id有多个。如果stopSelf(Id)并不是当前的Id那什么都不发生。

    绑定Service

    客户端组件可以通过bindService()与一个服务绑定。要使服务能够绑定,必须重写onbind()方法来返回一个IBinder实例,用于定义与Service通信的接口。bindService()可以拿到该接口,并通过IBinder对象的实例调用服务的方法。如果没有按照startService()启动,并且没有组件绑定到Service,系统就会销毁该Service。

    多个客户端可以同时绑定到同一个Service上。完成交互之后,可以调用unbindService()取消绑定。

    前台运行服务

    前台Service是一种用户可以感知的一种Service。所以,在内存不足的时候,系统也不会销毁它。前台服务必须提供状态栏的通知,状态栏中位于“正在进行”标题的下方。这意味着除非服务停止或者从前台删除,否则不能清除通知。
    调用startForeground()即可将服务变为前台服务。它需要两个参数:1. 唯一标识的整数(不能为0) 2. Notification。
    调用stopForeground()即可删除前台服务。一个参数: 是否删除标题栏通知。 这个方法是 不会停止服务的

    如果一个前台进程自行终止(stopSelf/stopService),那么通知栏中的通知也会被删除。

    Service生命周期

    Service Life Circle

    1. 整个生命周期,从onCreate()方法开始,onDestroy()方法结束。onCreate方法做初始化,onDestroy方法销毁资源。
    2. 有效生命周期,从onStartCommand()/onBind()开始。每种方法都需要传递一个Intent参数。

    startService()之后的生命周期与整个生命周期一致;bindService()之后剩下的生命周期到onUnbind()方法结束。

    于晓飞
  • 相关阅读:
    跑步前后吃什么?
    英雄杀八人场心得
    如何判断JavaScript数据具体类型
    js实现时间日期的格式化
    各个公司前端笔试题回顾
    原型模式Prototype,constructor,__proto__详解
    二级菜单不同方法的实现
    秋招笔试碰到的疑难题目1
    php和mysql学习问题笔记
    es6学习笔记12--Class
  • 原文地址:https://www.cnblogs.com/yuxiaofei93/p/5676021.html
Copyright © 2020-2023  润新知