Quantcast
Channel: Android*
Viewing all articles
Browse latest Browse all 531

Android 开发之四大组件 --- Service

$
0
0

一、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 ... >
      <serviceandroid: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 classHelloIntentService extendsIntentService {

  /**
   * A constructor is required, and must call the super IntentService(String)
   * constructor with a name for the worker thread.
   */

  publicHelloIntentService(){
      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
  protectedvoid 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(被开启,还允许绑定)的生命周期:

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

Icon Image: 

  • Technical Article
  • Android*
  • Developers
  • Android*
  • Theme Zone: 

    IDZone

    Include in RSS: 

    1

    Viewing all articles
    Browse latest Browse all 531

    Trending Articles


    Vimeo 10.7.1 by Vimeo.com, Inc.


    UPDATE SC IDOL: TWO BECOME ONE


    KASAMBAHAY BILL IN THE HOUSE


    Girasoles para colorear


    Presence Quotes – Positive Quotes


    EASY COME, EASY GO


    Love with Heart Breaking Quotes


    Re:Mutton Pies (lleechef)


    Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


    Vimeo 10.7.0 by Vimeo.com, Inc.


    FORECLOSURE OF REAL ESTATE MORTGAGE


    FORTUITOUS EVENT


    Pokemon para colorear


    Sapos para colorear


    Smile Quotes


    Letting Go Quotes


    Love Song lyrics that marks your Heart


    RE: Mutton Pies (frankie241)


    Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


    Long Distance Relationship Tagalog Love Quotes



    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>