`
bcyy
  • 浏览: 1826887 次
文章分类
社区版块
存档分类
最新评论

Android Service---继承Service类

 
阅读更多
继承IntentService类来实现一个被启动类型的服务很简单,但是如果你需要服务执行多线程(而不是通过工作队列来处理启动请求),那么你就要继承Service类来处理每个Intent。

为便于比较,下面例子中,Service类的实现代码执行了与之前“继承IntentService类”一节中的例子相同的工作,也就是说,对于每个启动请求,它都会使用一个工作线程来执行工作,并且每次只处理一个请求。

public class HelloService extends Service {
  private Looper mServiceLooper;
  private ServiceHandler mServiceHandler;

  // Handler that receives messages from the thread
  private final class ServiceHandler extends Handler {
      public ServiceHandler(Looper looper) {
          super(looper);
      }
      @Override
      public void handleMessage(Message msg) {
          // 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) {
                  }
              }
          }
          // Stop the service using the startId, so that we don't stop
          // the service in the middle of handling another job
          stopSelf(msg.arg1);
      }
  }

  @Override
  public void onCreate() {
    // Start up the thread running the service.  Note that we create a
    // separate thread because the service normally runs in the process's
    // main thread, which we don't want to block.  We also make it
    // background priority so CPU-intensive work will not disrupt our UI.
    HandlerThread thread = new HandlerThread("ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    
    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

      // For each start request, send a message to start a job and deliver the
      // start ID so we know which request we're stopping when we finish the job
      Message msg = mServiceHandler.obtainMessage();
      msg.arg1 = startId;
      mServiceHandler.sendMessage(msg);
      
      // If we get killed, after returning from here, restart
      return START_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
      // We don't provide binding, so return null
      return null;
  }
 

  @Override
  public void onDestroy() {
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
  }
}

正如你看到的,它要比继承IntentService类多做很多工作。

但是,因为你自己处理每个onStartCommand()方法的调用,你就能够同时执行多个请求。在上面的例子中没有这么做,但是如果你想要这么做的话,那么你就能够给每个请求创建一个新的线程,并且立即运行它们(而不是等待前一个请求完成)。

注意:onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值(虽然你能够修改这个值,但是IntentService处理还是为你提供了默认实现)。从onStartCommand()方法中返回的值必须是以下常量:

START_NOT_STICKY

如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。

START_STICKY

如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。

START_REDELIVER_INTENT

如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。

注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。

如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar

分享到:
评论

相关推荐

    Android代码-DaemonService

    DaemonService Android端心跳服务与进程保活 使用 继承AbsHeartBeatService抽象心跳服务,在onHeartBeat()中处理自己的任务,具体保活策略不需要关心 public class HeartBeatService extends AbsHeartBeatService { ...

    android service 简单实例源代码

    android service 简单实例代码 . binder继承一个接口,实现方法。

    Android代码-BleLib

    BleLib BleLib 是 Android 低功耗蓝牙 4.0 及以上开发的辅助库,一行代码解决 Ble 初始化、扫描、连接、特性读写、设置通知等操作。 BleLib 中的关键类: ...BleLib 中的 Ble 继承了 Service,因此建议绑定服务进

    Android service类的应用及源码例子.rar

    Android service类的应用及源码例子,通过Android service类创建一个音乐服务模块,演示service类的创建、启动和方法使用,以及Service生命周期的说明,该例子继承service 然后重写onStart播放音乐 重写onDestry停止...

    Android代码-安卓H5交互,独立规则

    只需要在service包中建立一个继承抽象类ActionService的类。重写和实现里面的方法。 同时也对应着json字符串转对象的方法,或者不转对象,直接返回字符串。把类名作为字符串的action发给js端,把参数对象的格式也...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android插件框架Android-Plugin-Framework.zip

    9、activity代理实现后,其他组件,如service等,如法炮制即可。 10、插件编译问题。 如果插件和宿主共享依赖库,那边编译插件的时候不可将共享库编译到插件当中,包括共享库的代码以及R文件,但是需要在...

    Android课程设计---基于Android系统的音乐播放器设计与实现.doc

    后台播放创建一个类继承service方法,在该类中使其具有播放暂 停下一首上一首的功能的方法,从而是它在各个Activity之间进行跳转的时候为其他的 类提供相应的方法。创建一个新建文件类和过滤文件信息的类,用以存贮...

    Android服务startService联系

    用AndroidStudio编写,里面的Activity有三个按钮,用startService函数分别启动三个服务,一 个是通过继承Service类实现的服务,一个是通过继承Service类在里面定义一个线程来处理服务,还有一个是通过继承...

    Android Service使用注意事项1

    1、使用Service需要在Android Manifest.xml文件中注册Service,如下代码:新建一个普通的class,然后继承Service,那么需

    Android Service控件用法实例分析

    本文实例讲述了Android...定义一个Service比较简单,只要继承Service类,实现其生命周期的方法即可。一个定义好的Service必须在AndroidManifest.xml文件中通过&lt;service&gt;声明才能使用 &lt;service android:name=MyService&gt;

    Android-Service实现手机壁纸自动更换

    本文实例为大家分享了Android Service实现自动更换...首先定义ChangeService类,继承Service访问系统实现壁纸切换 public class ChangeService extends Service { int[] wallpapers = new int[]{ R.drawable.a2, R.

    Android Service类与生命周期详细介绍

    Android Service类与生命周期 Service是Android四大组件与Activity最...第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service public class MyService extends Service {

    service和acivity之间通信

    Service和Activity之间通信,新建一个MyBinder类,继承Binder, new ServiceConnection();回调onServiceConnected

    android后台运行的service服务的创建

    安卓的service的创建和调用其实和activity基本上一个样,很简单,只是继承Service类,在里面写一个onStartCommand方法,然后在该方法下写自己的代码就可以了。

    android的服务

    Android中已经定义了一个 ‘Service’类,所有其他的Service都继承于该类。Service类中定义了一系列的生命周期相关的方法,如: onCreate(), onStart(), onDestroy()。参见下例: package ...

    Android-System-Related-Charts:各种与Android系统相关的框架图、流程图

    运行机制handler机制时序图handler机制UML类图应用框架相关四大组件Activity的生命周期Activity间的数据交互Fragment的声明周期service的生命周期UI相关View中widgets相关类的继承关系Android事件分发机制Android...

    Android Service

    Android中的sercice分为本地服务和远程服务: ...(需要将代理接口.java扩展名改为.aidl,继承接口的实现类Stub),另外需要将远程服务中的aidl包名和文件拷贝到本地应用程序的工程中。 远程服务调用的Demo见附件。

    Android Activity与Service通信(不同进程之间)详解

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,...

    android项目之aidl跨进程调用举例Demo

    android项目之aidl跨进程调用举例Demo,开发aidl跨进程调用,主要分以下步骤: ...4. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例

Global site tag (gtag.js) - Google Analytics