zoukankan      html  css  js  c++  java
  • Android 官方 Service 详解

    Service
    一、类概述
    服务是不是代表一个应用程序的愿望来执行长时间运行的操作,而不是与用户交互,或提供的功能的其他应用程序使用的应用程序组件。每个服务类必须有一个相应的 <服务> 宣布在其包装的AndroidManifest.xml文件。服务可以启动 Context.startService()和 Context.bindService() 。

    需要注意的是服务,像其他应用程序对象,在他们的宿主进程的主线程中运行。这意味着,如果你的服务是打算做任何CPU密集型(如MP3播放)或阻塞(如网络)的操作,它应该产卵在做的工作自己的线程。有关这方面的更多信息,可以发现 进程和线程。该IntentService类 ​​可以作为一个标准的实现服务的,有它自己的线程在那里做它的时间表工作。

    这里所涵盖的主题:
    什么是服务?
    服务生命周期
    权限
    流程生命周期
    本地服务示例
    远程Messenger服务样片

    什么是服务?
    最混乱的服务类实际上都是围绕着什么是不是:
    服务是不是一个单独的进程。服务对象本身并不意味着它是运行在其自己的进程; 除非另外指明,它运行在同一进程中的应用程序是的一部分。
    服务是不是一个线程。它不是指自己做的工作,关闭主线程(为了避免应用程序无响应的错误)。
    因此,一个服务本身其实很简单,提供了两个主要特点:
    一个工具,以便应用程序告诉系统有关 的东西就是了做的背景(即使用户没有直接与应用程序交互)。这相当于调用 Context.startService() ,它要求系统安排工作,为服务来运行,直到服务或其他人明确制止。
    一个工具,以便应用程序能够揭露它的一些功能,其他的应用程序。这对应于调用 Context.bindService() ,它允许一个长期连接到可向服务以便与它进行交互。
    在实际创建服务组件,是由以下原因,所有的系统实际上做的是实例化该组件并调用它的onCreate()和主线程上的任何其他适当的回调。它是由服务与适当的行为来实现这些,如创建,其中它的工作辅助线程。
    需要注意的是,因为服务本身就是这么简单,你可以用它作为简单的或复杂的让你的互动,你想:把它当作是你做的直接方法调用(如图所示由本地Java对象本地服务示例),提供全remoteable接口使用AIDL。

    服务生命周期

    它有一个服务可以由系统中运行两个原因。如果有人致电Context.startService() ,然后系统会检索服务(创建并调用它的onCreate() ,如果需要的方法),然后调用它的onStartCommand(意向,INT,INT)与客户端提供的参数的方法。该服务将在该点继续运行,直到Context.stopService()或 stopSelf()被调用。请注意,多次调用Context.startService()不嵌套(虽然他们导致多个相应的调用onStartCommand()),所以无论多少次启动的服务将被停止一次Context.stopService()或stopSelf ()被调用; 然而,服务可以使用自己的stopSelf(int)的方法,以确保服务不会停止,直到启动的意图已被处理。
    为开始的服务,有两种操作附加主要模式,他们可以决定运行中,这取决于它们从onStartCommand()返回值:START_STICKY用于显式启动和停止作为所需要的服务,而START_NOT_STICKY 或START_REDELIVER_INTENT使用服务应该仅停留在处理发送给他们的任何命令运行。见链接文档的语义更详细。
    用户还可以使用Context.bindService()获取到服务的持续连接。这也造成了服务,如果它尚未运行(调用的onCreate() ,而这样做),但不调用onStartCommand()。客户端将接收到 的IBinder对象,该对象从它的服务返回 onBind(意图)的方法,使得客户端可以接着进行呼叫返回给服务。该服务将保持运行,只要建立了连接(客户端是否保留于该服务的的IBinder基准)。通常情况下,返回的IBinder是已复杂的界面写的AIDL。
    一个服务可以同时起步,并没有绑定到它的连接。在这样的情况下,系统将保持服务,只要它要么开始运行或有一个或多个连接到其与 Context.BIND_AUTO_CREATE 标志。一旦没有这些的情况下成立,在服务的的onDestroy()方法被调用,该服务是有效的终止。全部清除(停止线程,注销接收器)应在从返回的onDestroy完成()。

    权限

    以服务全球访问可以当它在其清单的声明予以强制执行<服务> 标签。通过这样做,其他应用程序将需要声明相应的 <使用,许可> 元素在自己的清单,以便能够启动,停止,或绑定到该服务。
    由于姜饼,使用时 Context.startService(意向),还可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION的意图。这将给予该服务的临时接入该特定的URI中的意图。Access将保留,直到该服务被称为stopSelf(INT)为启动命令或更高的,或直到服务已完全停止。这适用于授权访问,但没有要求保护服务的许可,甚至当服务未出口的所有其他应用程序。
    此外,一个服务可以保护个人IPC调用到它的权限,通过调用 checkCallingPermission(字符串) 执 ​​行该调用之前执行方式。
    请参阅安全性和权限 文件的权限和一般的信息安全。

    流程生命周期

    Android系统将试图保持过程的托管服务各地只要服务已启动或已绑定到它的客户。当内存不足和需要杀死现有的流程,托管服务进程的优先级将是以下几种可能的较高者:

    如果该服务在当前执行代码 的onCreate() ,onStartCommand() ,或的onDestroy()方法,那么宿主进程将是一个前台进程,以保证这个代码没有被杀死都可以执行。

    如果该服务已启动,则其宿主进程被认为是比当前可见的屏幕上的用户的任何过程不那么重要,但更重要的,比任何不可见的过程。因为只有少数的进程一般是用户可见的,这意味着该服务不应该,除非在极端的内存不足的情况​​杀害。

    如果有绑定到该服务的客户端,则该服务的承载过程是决不会比最重要的客户端不那么重要。也就是说,如果它的客户端之一是用户可见的,然后本身被认为是服务是可见的。

    已启动的服务可以使用startForeground(INT,通知) API来把服务前台状态,其中系统认为它是什么,用户是主动认识,因而没有对内存的时候杀低的候选人。(它仍然是理论上可能的服务下,从目前的应用前景极内存压力被杀死,但在实践中,这不应该是一个问题。)
    请注意,这意味着,大部分的服务正在运行的时候,它可能会被系统杀死,如果它是在沉重的内存压力。如果发生这种情况时,系统会稍后尝试重新启动该服务。这方面的一个重要后果是,如果你实现onStartCommand() 安排工作,异步或在另一个线程完成的,那么你可能需要使用START_FLAG_REDELIVERY让系统重新提供一个Intent你这样它就不会迷路如果你的服务被杀害,而处理它。
    在相同的处理的服务(例如,运行的其它应用程序组件的活动过程中)可以,增加超出了服务本身只是重要性的整体过程的重要性。

  • 相关阅读:
    CentOS下date命令
    spring-data-redis --简单的用spring-data-redis
    Unable to Rebuild JIRA Index
    JIRA Cannot Start Due to 'unable to clean the cache directory: /opt/jira/plugins/.osgi-plugins/felix'
    Java compiler level does not match the version of the installed Java project facet.
    maven scope含义的说明
    maven 下载 源码和javadoc命令
    Redis 入门第一发
    mysql 1194 – Table ‘tbl_video_info’ is marked as crashed and should be repaired 解决方法
    tomcat用redis做session共享
  • 原文地址:https://www.cnblogs.com/zx-blog/p/11835604.html
Copyright © 2011-2022 走看看