• Android Service基础


    Service

       Service 是一个组件,用来执行长时间的后台操作,不提供用户界面

      另一个应用组件可以启动一个Service,它将持续地在后台运行,即便是用户转移到另一个应用它也不会停止。

      另外,Service可以和另一个组件绑定,与其进行交互,可以进行跨进程的通信(interprocess communication (IPC))。

      比如,Service可以用来处理网络交易,播放音乐,执行文件I/O,与content provider交互等,所有这些都是从后台进行。

    一个Service可以采取两种形式

    1.Started

      当另一个组件(比如一个activity)调用 startService()方法来启动一个service,这个service为started。

      一旦开始,这个service可以一直在后台运行,即便开启它的那个组件被销毁。

      通常,一个被开始的组件执行一个单一的操作,并不返回值给它的调用者。

      比如,它可以通过网络下载或上传一个文件。当这个操作完成时,service将自己停止。

    2.Bound

      当另一个组件通过bindService()方法与其进行绑定,service就处于bound状态。

      一个被绑定的service提供一个client-service接口,允许组件和其进行交互,发送请求,得到结果,甚至进行跨进程的交互(interprocess communication,IPC)。

      一个被绑定的service只有当其他应用组件和其绑定的时候才运行。

      当多个组件与其绑定时,当所有组件都unbind时,这个service才被销毁。

      注意,service可以同时在这两种状态下工作,它可以被started(为了无限运行),同时允许绑定。

      仅仅关系到你是否实现了这两个回调函数:onStartCommand() 允许组件去开启它, onBind() 允许绑定。

      注意:一个service运行在其宿主进程的主线程里面。

      一个service不会创建它自己的线程,也不会运行在一个分开的进程里面(除非你特殊指定)。

      这意味着,如果你的service要做一些耗费CPU的工作或者阻塞性的操作(比如MP3播放或者网络操作),你应该在service里面创建一个新的线程去做这项工作

      通过一个独立的线程,你将减小遇到ANR(Application Not Responding)错误的风险,应用的主线程将能够继续保持用于在activity中和用户交互。

     

    Service使用基础

      为了使用service,你必须创建一个继承自Service 的类。

    最重要的几个要覆写的回调函数如下:

    onStartCommand()

      当另一个组件,比如activity开启这个service时,开启动作是通过startService()方法,而service则会调用这个onStartCommand()函数。

      一旦这个onStartCommand()被执行,service将会在后台无限地运行,如果你要实现它,你需要在工作结束时停止这个service(通过stopSelf() 或  stopService())。

      当然,如果你只想提供绑定,你是不需要实现这个方法的。 

    onBind()

      当另一个组件想要和service进行绑定时(绑定是通过bindService()方法),系统会调用这个onBind()方法。

      在你的实现中,你必须提供一个交互的接口IBinder。你必须实现这个方法,但是如果你不想允许绑定,你应该返回一个null。

      如果一个组件通过bindService()方法来创建一个service(并且onStartCommand() 没有被调用),那么这个service和创建它的组件有一样长的生命。

      一旦service和所有的客户组件解除绑定,系统将会销毁它。

    onCreate()

      当service第一次被创建的时候系统会调用这个方法,如果这个service已经在运行,则不会调用这个方法。

    onDestroy()

      当service不再被使用,被销毁时调用这个onDestroy()方法。

      你的service应该实现这个方法,去清理一些资源,比如线程、监听器、接收器等。这是一个service最后调用的方法。

    在manifest中声明service

    <application> 中增加一个 <service> 子标签:

    <manifest ... >
      ...
      <application ... >
          <service android:name=".ExampleService" />
          ...
      </application>
    </manifest>

     

      android:name 属性是唯一必须的属性,它指定了service的类名。

      更多信息可以看<service> 元素的文档。

      和activity一样,service中也可以定义intent filters,这样,其他组件就可以通过隐式的intent来启动这个service。这样,其他应用的组件就有可能开启你的service。

      如果你只想在你自己的应用中用这个service,你就不需要(也不应该)提供任何的intent filters。

      没有intent filters的service必须通过显式的intent来启动。

      另外,如果你想确保你的service是你的应用所私有的,你可以包含android:exported属性,将其设置为false。这样,即便是你的service提供了intent filters,别的应用中的组件也不能使用它。

    参考资料

      API Guides:Services

      http://developer.android.com/guide/components/services.html

      API Guides:Bound Services

      http://developer.android.com/guide/components/bound-services.html

      博客园博客:

      http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html

      CSDN 博文:

      http://blog.csdn.net/fengqiangfeng/article/details/7555213

     

  • 相关阅读:
    Web移动端项目适配(适用于原生JavaScript,Vue,React等项目中)
    Vue——实现一键复制
    解决报错Uncaught (in promise) NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}
    解决h5嵌入app后video标签poster不能显示视频第一帧(表现为空白)
    Vue——长按元素实现某种操作
    小程序生命周期
    解决 mpvue 项目使用 vant-weapp 组件库 Uploader 时其中的 after-read 方法回调函数调用不成功
    我的考场vimrc的配置
    ubuntu vim solarized vimrc配置
    HNOI 2015 亚瑟王 概率期望DP
  • 原文地址:https://www.cnblogs.com/mengdd/p/2978590.html
Copyright © 2020-2023  润新知