Android IntentService vs Service

原创 2015年07月11日 00:10:11

Android IntentService vs Service

众所周知,Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用中某些功能仍然可以工作而引入了Service,比如播放音乐。针对service,官方文档有2点重要说明:
1. A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.除非特别说明,否则和应用是在同一个进程中
2. A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors). Service不是一个线程,也就是说service和UI主线程是在同一线程中运行的,因此service不能执行耗时长的处理,防止出现ANR。
因此如果APP需要在service执行长时间处理时,需要起个独立线程来处理该操作。
Android为我们考虑到了这一点,所以提供了IntentService类。IntentService继承于Service,可以认为是开了一个线程来处理事件的service.
IntentService有如下优点:
1. IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work. 队列任务按序执行,全部任务结束后会结束自己。
2. This “work queue processor” pattern is commonly used to offload tasks from an application’s main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
3. All requests are handled on a single worker thread – they may take as long as necessary (and will not block the application’s main loop), but only one request will be processed at a time.所有请求在一个工作线程中完成,但是一次之后处理一个。
下面我们对IntentService代码进行分析:
继承自service
public abstract class IntentService extends Service
有一个工作线程,在onCreate中创建该线程
HandlerThread thread = new HandlerThread(“IntentService[” + mName + “]”);
内部通过handler来处理startService发送的消息事件。同样在onCreate函数中创建thread looper和Handler
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);

而在每次调用startService时会将任务添加到队列中

public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
}

Handler执行过程为:

private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
}

从上面可见IntentService是按照顺序来执行的,全部任务执行完成后工作线程finish。

使用如下:
在manifext.xml中添加声明

然后在调用的地方直接使用:

public void startService() {
  Intent intent = new Intent(this, XXXIntentService.class);
  startService(intent);
 }

 public void stopService() {
  Intent intent = new Intent(this, XXXIntentService.class);
  stopService(intent);
 }

其中调用stopService会直接调用IntentService的onDestroy函数,当前正在执行的任务不会暂停,等该任务完成后线程关闭。如果需要立即结束任务,则可以通过设置变量来让当前任务尽快结束。

Android中IntentService与Service的区别

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独...

HTTP协议详解

HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要,...

Android中killProcess()、System.exit(0)及finish()的区别

在Android中,提起退出一个程序,大家都很熟悉,而且也会随口说出好多方式,众所周知的,我们常常能见到的如finish(),这个方法相信用到的最多了,当然还有System.exit()和androi...

Android开发之Service与IntentService的区别与使用场景

转载自:点击打开链接 Service Service 是长期运行在后台的应用程序组件。 Service 不是一个单独的进程,它和应用程序在同一个进程中,Service 也不是一个线程...

Android开发之Service与IntentService的区别与使用场景(源代码剖析)

因为最大部分的service不需要同时处理多个请求(处理多个请求是一个比较危险的多线程的场景),这样在在这种情况下呢,最好使用IntentService类如果你实现你的服务。   使用intentSe...

Android Service(三) IntentService详解

通过前面两篇文章的介绍,我们对Service有了更深入的了解了!如果你还未了解,详情请看 Android Service(一) Service初识 和 Android Service(二) Serv...

Android笔记 IntentService与Service的区别

Service 在官方API(http://developer.android.com/reference/android/app/Service.htmlhttp://developer.andro...
  • cuiran
  • cuiran
  • 2015年02月27日 12:14
  • 11754

android四大组件之Service和子类IntentService

四大组件中, Service跟Activity的生命周期非常类似,它也是可执行的.甚至可看做是没有界面的"Activity", 因为它的运行,用户并不会像Activity那样能看到它能呈现出来具体的视...
  • stzy00
  • stzy00
  • 2015年03月07日 10:14
  • 846

android之service和Intentservice详解

意思是说:IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的on...
  • zhongwn
  • zhongwn
  • 2014年04月18日 00:36
  • 1682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android IntentService vs Service
举报原因:
原因补充:

(最多只允许输入30个字)