Android开发之四大组件——Service

一、Service


简单介绍

Service是android系统中的四大组件之中的一个(Activity、Service、BroadcastReceiver、ContentProvider)。它跟Activity的级别差点儿相同,差别是Service仅仅能执行在后台不提供用户界面,而且能够和其它组件进行交互。一个Service是一个能够长期执行在后台的应用程序组件,不提供用户界面。

还有一个应用程序组件能够启动一个服务,它将继续在后台运行,即使 用户切换到还有一个应用程序。 此外,一个组件能够绑定到一个服务 与之交互,甚至运行进程间通信(IPC)。 比如,一个服务能够在后台处理网络交易、播放音乐、运行文件I / O,或与内容提供者交互等。

一个服务能够基本上有两种形式:

Started:

一个服务将被开启,当一个应用程序组件(比如,一个Activity)启动它 调用startService()

一个服务一旦启动,能够无限期地在后台执行,即使启动它的组件被摧毁。

通常情况下,
開始服务运行一个操作,不向调用者返回一个结果。 比如,它可能通过网络下载或上传文件。 当操作完毕, 服务应该自己主动销毁。

Bound:

一个服务被“绑定”当一个应用程序组件绑定到它通过调用bindService()。一个绑定服务提供了一个client - server接口。同意组件与服务交互,发送请求,得到的结果。甚至这样做跨进程与进程间通信(IPC)。

一个service能够同一时候和多个客户绑定,当多个客户都解除绑定之后。系统会销毁service

注意:一个服务执行在其宿主进程。该服务不会创建自己的线程。并不在一个单独的进程中执行的主线程(除非另行指定)。

这意味着。假设你的服务是打算进行不论什么耗时操作(比如MP3播放或网络下载等),你应该在该服务中创建一个新的线程来执行该工作。

通过使用一个单独的线程,你会降低应用程序的不响应(ANR)错误和应用程序的UI主线程能够继续致力于为响应用户的操作。

二、创建Service


要创建一个服务。你必须创建Service的子类(或者其现有的一个子类)。在实现的子类中处理Service生命周期的关键方面的一些回调方法,并提供了一种机制,组件绑定到该服务,能够依据须要重写这些回调方法:

onStartCommand()

每次client调用startService()方法启动该Service都会回调该方法。

onBind()

该方法是每一个Service的子类必须实现的方法。该方法返回一个IBinder对象,应用程序能够通过该对象和Service组件进行通信。

假设你不希望同意绑定,那么应该返回null。

onCreate()

当Service第一次被创建后将马上回调该方法。

onDestroy()

当Service被销毁之前回调该方法,你创建的Service应该在这种方法中清理不在使用的资源,如线程,注冊的侦听器。接收器等。

在配置文件里注冊Service:

<manifest ...
>

  ...

  <application ...
>

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

      ...

  </application>

</manifest>

三、IntentService类


由于最開始的服务不须要同一时候处理多个请求(实际上是一个危急的多线程的情况下)。这可能是最好的假设你实现你的服务使用intentservice类。

 IntentService是Service类的子类,用来处理异步请求。client能够通过startService(Intent)方法传递请求给IntentService。IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来处理全部Intent请求对象(通过startService的方式发送过来的)所相应的任务。这样以免事务处理堵塞主线程。

运行完所一个Intent请求对象所相应的工作之后,假设没有新的Intent请求达到,则自己主动停止Service。否则运行下一个Intent请求所相应的任务。

IntentService在处理事务时,还是採用的Handler方式。创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所相应的子线程。 ServiceHandler把处理一个intent所相应的事务都封装到叫做onHandleIntent的虚函数;因此我们直接实现虚函数onHandleIntent,再在里面依据Intent的不同进行不同的事务处理就能够了。

另外。IntentService默认实现了Onbind()方法,返回值为null。

  使用IntentService须要两个步骤:

  1、写构造函数

  2、实现虚函数onHandleIntent。并在里面依据Intent的不同进行不同的事务处理就能够了。

优点:处理异步请求的时候能够降低写代码的工作量,比較轻松地实现项目的需求

注意:IntentService的构造函数一定是參数为空的构造函数,然后再在当中调用super("name")这样的形式的构造函数。

由于Service的实例化是系统来完毕的,并且系统是用參数为空的构造函数来实例化Service的

以下是IntentService的一个实例:

public
class HelloIntentService
extends IntentService
{



  /**

   * A constructor is required, and must call the super IntentService(String)

   * constructor with a name for the worker thread.

   */

  public HelloIntentService(){

      super("HelloIntentService");

  }



  /**

   * The IntentService calls this method from the default workerthread with

   * the intent that started the service. When this method returns,IntentService

   * stops the service, as appropriate.

   */

  @Override

  protected void onHandleIntent(Intent intent){

      // Normally we would do some work here, like download a file.

      // For our sample, we just sleep for 5 seconds.

      long endTime
= ;

      while (System.currentTimeMillis()< endTime){

          synchronized
(this){

              try
{

                  wait(endTime
- System.currentTimeMillis());

              } catch(Exception e){

              }

          }

      }

  }

}

四、The Lifecycle of a Service


不像是activity的生命周期回调函数,你不须要调用父类运行这些回调方法。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3l1emhlbmdmYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

注:左边的图显示了使用的StartService()创建的服务的生命周期和右边的图显示了使用StartService()创建的服务的生命周期。

·        Service总体的生命时间是从onCreate()被调用開始。到onDestroy()方法返回为止。

和Activity一样,Service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。

比方。一个音乐播放Service能够在onCreate()中创建播放音乐的线程,在onDestory()中停止这个线程。  onCreate() 和 onDestroy()会被全部的Service调用。不论Service是通过startService()还是bindService()建立。

·        Service积极活动的生命时间(activelifetime)是从onStartCommand() 或onBind()被调用開始,它们各自处理由startService()或 bindService()方法传过来的Intent对象。

  假设Service是通过startService()开启的,那么它的活动生命周期和整个生命周期一同结束。

  假设Service是通过bindService ()开启的。它们它的活动生命周期是在onUnbind()方法返回后结束。

  注意:虽然一个被开启的Service是通过调用 stopSelf() 或 stopService()来停止的。没有一个相应的回调函数与之相应。即没有onStop()回调方法。所以,当调用了停止的方法。除非这个Service和客户组件绑定。否则系统将会直接销毁它,onDestory()方法会被调用。而且是这个时候唯一会被调用的回调方法。

五、Managing the Lifecycleof a Bound Service

当绑定Service和全部client解除绑定之后,Android系统将会销毁它。(除非它同一时候被onStartCommand()方法开启)。

因此,假设你的Service是一个纯粹的绑定Service,那么你不须要管理它的生命周期。

然而。假设你选择实现onStartCommand()回调方法,那么你必须显式地停止service,由于service此时被看做是开启的。

这样的情况下,Service会一直执行到它自己调用 stopSelf()或还有一个组件调用stopService(),不论它是否和client绑定。

另外,假设你的Service被开启而且接受绑定,那么当系统调用你的 onUnbind()方法时。假设你想要在下次client绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你能够选择在 onUnbind()中返回true。onRebind()的返回值为void,可是client仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。

下图展示了这样的Service(被开启。还同意绑定)的生命周期:



未完待续.............

Android开发四大组件之Service(具体解释篇)的更多相关文章

  1. Java乔晓松-android的四大组件之一Service(服务的绑定)

    android的四大组件之一Service(服务的绑定) 怎么绑定服务,又怎么解除服务,代码如下: MainActivity.java源码: package com.example.lesson14_ ...

  2. Android开发四大组件概述

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity具体解释 二.Service具体解释 三.Broadcast Receiver具体解释 四.Content Provid ...

  3. 一个帖子学会Android开发四大组件

    来自:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Act ...

  4. 一天就学会Android开发四大组件

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

  5. 关于Android开发四大组件

    文章主要是讲Android开发的四大组件,本文主要分为 文章源自:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html 一.Act ...

  6. 从零开始学android开发-四大组件之一 Activity

    1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的, ...

  7. Android Studio四大组件之Service

    Service在Android运行在后台,它没有可视化界面,只是默默运行在后台.我们以一个后台定时器的例子清晰的说明Service的运行流程. 一.创建Service类 项目右键->New-&g ...

  8. 【Android开发日记】之入门篇(五)——Android四大组件之Service

    这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...

  9. Android 四大组件之 Service(一)

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

随机推荐

  1. LOJ2522:[FJOI2018]邮递员问题(乱搞)

    传送门 乱搞. 可以发现如果起点在左边界,终点在右边界的时候上下走的点一定是连续的(可能吧) 那么可以设 \(f_{i,j,0/1}\) 表示当前上面到 \(i\),下面到 \(j\),当前在上面/下 ...

  2. NOI.AC NOIP2018 全国热身赛 第四场

    心路历程 预计得分:\(0 + 100 +100\) 实际得分:\(10 + 100 + 0\) 神TM T3模数为啥是\(1e9 + 9\)啊啊啊啊,而且我也确实是眼瞎...真是血的教训啊.. T2 ...

  3. 如何将在线电子书保存为pdf格式

    网上有很多免费的在线电子书籍,没有pdf格式,不方便离线阅读,也不方便做记录,所以找了几个将在线内容制作成pdf文件的方法. 一.如果网站上的书籍内容没有分页,所有内容都直接显示出来了,最简单,直接将 ...

  4. Nginx基本的安全优化

    为了防止nginx出现软件漏洞,我们要对nginx软件服务加强一些安全性,下面就介绍一下基本的安全优化 1.隐藏nginx版本号: 想要隐藏,首先我们要了解所使用软件的版本号,我们可以在Linux中查 ...

  5. 移动设备 小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法

    小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法 by:授客 QQ:1033553122 用户环境 操作系统:Win7 手机设备:小米2S   问题描 ...

  6. OpenCV 图像特效

    1.RGB ->灰度 #灰度 方式1 img=cv2.imread('b.png',0) img1=cv2.imread('b.png',1) height=img1.shape[0] widt ...

  7. Expo大作战(十七)--expo结合哨兵(sentry)进行错误异常记录

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. Postsharp基本用法——方法、属性拦截与异常处理

    以下Demo代码基于 .NET Core 演示了Postsharp的基本使用方法,稍作修改(反射部分有些许差异)也适用于.NET Framework. 更多高级使用方法详见官方文档.http://sa ...

  9. 【SPL标准库专题(8)】 Datastructures:SplFixedArray

    SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 类摘要 SplFixedArray im ...

  10. Markdown 进阶

    目录 markdown进阶语法 内容目录 加强代码块 脚注 流程图 时序图 LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动 ...