关闭

Android开发四大组件之Service(详解篇)

标签: Android开发Android四大组件serviceAndroid Service详解Android开发四大组件之Servic
5374人阅读 评论(1) 收藏 举报
分类:

Android开发之四大组件——Service

一、Service


简介

Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Service只能运行在后台不提供用户界面,并且可以和其他组件进行交互。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。 另一个应用程序组件可以启动一个服务,它将继续在后台运行,即使 用户切换到另一个应用程序。 此外,一个组件可以绑定到一个服务 与之交互,甚至执行进程间通信(IPC)。 例如,一个服务可以在后台处理网络交易、播放音乐、执行文件I / O,或与内容提供者交互等。

一个服务可以基本上有两种形式:

Started:

一个服务将被开启,当一个应用程序组件(例如,一个Activity)启动它 调用startService()。一个服务一旦启动,可以无限期地在后台运行,即使启动它的组件被摧毁。通常情况下, 开始服务执行一个操作,不向调用者返回一个结果。 例如,它可能通过网络下载或上传文件。 当操作完成, 服务应该自动销毁。

Bound

一个服务被“绑定”当一个应用程序组件绑定到它通过调用bindService()。一个绑定服务提供了一个客户端 - 服务器接口,允许组件与服务交互,发送请求,得到的结果,甚至这样做跨进程与进程间通信(IPC)。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service

注意:一个服务运行在其宿主进程,该服务不会创建自己的线程,并不在一个单独的进程中运行的主线程(除非另行指定)。这意味着,如果你的服务是打算进行任何耗时操作(例如MP3播放或网络下载等),你应该在该服务中创建一个新的线程来执行该工作。通过使用一个单独的线程,你会减少应用程序的不响应(ANR)错误和应用程序的UI主线程可以继续致力于为响应用户的操作。

二、创建Service


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

onStartCommand()

每次客户端调用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类的子类,用来处理异步请求。客户端可以通过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 = System.currentTimeMillis()+5*1000;
      while (System.currentTimeMillis()< endTime){
          synchronized (this){
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch(Exception e){
              }
          }
      }
  }
}

四、The Lifecycle of a Service


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


注:左边的图显示了使用的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和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。

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

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

这种情况下,Service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。

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

下图展示了这种Service(被开启,还允许绑定)的生命周期:


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

29
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android系统开发之一:添加系统级服务方法

说明:本次说的系统服务,是指捆绑在system_process进程中的服务。 仔细阅读源码可以发现,在frameworks/base/services/java/com/android/server/SystemServer.java中添加了很多服务,什么熵信息、电量、wife等等服务,这些服务启动...
  • cbk861110
  • cbk861110
  • 2016-03-15 19:28
  • 2458

Android服务开发——WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关...
  • guwei4037
  • guwei4037
  • 2014-08-05 16:42
  • 10603

Android服务开发经验——优雅地活着(唤醒)

大多数的Android应用开发都会将注意力集中在界面功能上,只有少数应用会需要一个Service,尤其是一个长期运行的Service,去进行后台联网、环境检测、媒体播放等功能。Android环境下的Service有其自身的特点,为了让服务完美地实现预想的功能,首先要解决的一个重要问题就是:如何让你的...
  • rongwenbin
  • rongwenbin
  • 2015-10-29 14:09
  • 1098

Android开发-后端Model_Service

Android开发-后端Model_Service sf2gis@163.com 2015年12月26日 1 目标:后台服务功能,不具备交互展示功能。 2 原理:Activity删除交互功能。 3 流程:创建服务,创建交互内容,调用服务。 3.1 创建服务:...
  • sf2gis2
  • sf2gis2
  • 2016-01-18 16:08
  • 922

安卓开发之服务Service

一、Service是什么? Service是一个应用组件,它用来在后台完成一个时间跨度比较大的工作,且没有关联任何界面。(生命周期在应用程序进程的主线程运行) 一个Service可以完成的工作:访问网络(在Service中启动分线程)、播放音乐、文件IO操作、大数据量的数据库操作等。如果需要在Ser...
  • cxmscb
  • cxmscb
  • 2016-07-14 12:49
  • 758

android开发之socket通信 向PC机发信息 获取本机IP

今天早早的就完成了任务,给大家分享一下socket编程。android中使用的是java的socket模型,如果你学过java网络编程,那么你对它一定不陌生。今天我主要使用TCP协议实现通信的。小知识点:UDP协议和TCP协议的不同。UDP是把数据都打成数据包
  • zzy916853616
  • zzy916853616
  • 2011-07-06 18:01
  • 38418

Android开发中后台的Service服务探索

最近在编写一个基于Android 2.1 的手机应用程序,其中的一个功能是利用Google 的地图API接口实现足迹追踪,整个程序设计大概分为三个部分,UI设计、GoogleMapAPI接口调用以及后台Service所做的数据的采集和传输以及和服务器的通讯。 Android的UI设计和JAVA、M...
  • CloudCraft
  • CloudCraft
  • 2012-06-21 13:17
  • 12917

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道。它们可以在无形中使我们的软件和网络、数据库、系统等进行交互,之后通过UI(Notification就是一种展示方式...
  • vipzjyno1
  • vipzjyno1
  • 2014-05-19 08:07
  • 46239

android的Service----讲述四大组件之一服务

Services Service是一个应用程序组件,它可以在后台之中持续运行并且不用提供用户的操作界面,相当于一个幕后工作者。其他的应用程序也可以自己启动一个服务,然后该服务会自动在后台运行,即使你切换到另一个程序之中。除此之外,android允许一个组件绑定到某一个服务上并与之交互甚至可以是进程...
  • hu3971898
  • hu3971898
  • 2014-01-09 17:19
  • 1120

Android四大组件之Service简介

本文对Service进行了简要介绍。
  • qq_33721382
  • qq_33721382
  • 2017-07-21 20:37
  • 141
    个人资料
    • 访问:983667次
    • 积分:12028
    • 等级:
    • 排名:第1436名
    • 原创:181篇
    • 转载:4篇
    • 译文:0篇
    • 评论:225条
    这里有你需要的干货!!!
    关注我,获取推送O_o
    你需要的,才是干货@开源项目
    博客专栏
    最新评论