IntentService与Service的区别

IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

先来看一下IntentService类的源码:

public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start(); //开启一个工作线程

        mServiceLooper = thread.getLooper(); //单独的消息队列
        mServiceHandler = new ServiceHandler(mServiceLooper);
 }

定义一个IntentService的子类:

public class MIntentService extends IntentService {

    public MIntentService(){
        super("MIntentService");
    }

    /**
     * Creates an IntentService.  Invoked by your subclass‘s constructor.
     * @param name Used to name the worker thread, important only for debugging.
     */
    public MIntentService(String name) {
        super(name);
    }

    @Override
    public void onCreate() {
        Log.e("MIntentService--", "onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("MIntentService--", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.e("MIntentService--", Thread.currentThread().getName() + "--" + intent.getStringExtra("info") );
        for(int i = 0; i < 100; i++){ //耗时操作
            Log.i("onHandleIntent--",  i + "--" + Thread.currentThread().getName());
        }
    }

    @Override
    public void onDestroy() {
        Log.e("MIntentService--", "onDestroy");
        super.onDestroy();
    }
}

开启IntentService服务:

 public void intentClick(View v){
        Intent intent = new Intent(this, MIntentService.class);
        intent.putExtra("info", "good good study");
        startService(intent);
 }

点击按钮之后输出结果为(过滤log.e):

10-25 16:54:58.852  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onCreate
10-25 16:54:58.852  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onStartCommand
10-25 16:54:58.856  27135-27354/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ IntentService[MIntentService]--good good study
10-25 16:54:58.879  27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onDestroy

  Intent服务开启后,执行完onHandleIntent里面的任务就自动销毁结束,通过打印的线程名称可以发现是新开了一个线程来处理耗时操作的,即是耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。

时间: 2024-12-16 10:33:59

IntentService与Service的区别的相关文章

android开发步步为营之60:IntentService与Service的区别

这个面试的时候,相信是面试官最爱的问题之一.简单的来说,IntentService继承至Service,Service和Acitivity一样是依附于应用主进程的,它本身不是一个进程或者一个线程.一些耗时的操作可能会引起ANR的bug,(本文测试的时候,Service执行20秒没有报ANR),而IntentService,看它的源代码,onCreate()其实是创建了一个新的线程. /* * Copyright (C) 2008 The Android Open Source Project *

Android笔记 IntentService与Service的区别

Service 在官方API的描述为 A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service clas

REST和SOAP Web Service的区别比较

本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系! ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是

Android IntentService vs Service

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;

WCF、Web API、WCF REST、Web Service之区别

http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html .NET framework 有很多的技术来创建HTTP service,比如:Web Service, WCF 和Web API.下面讲述一下它们的区别: Web Service 基于SOAP,并且返回XML数据. 只支持HTTP协议. 非开源,但

Servlet和Web Service的区别

在最开始学习Web Service时候,总觉得Web Service和Servlet没有什么区别,觉得Servlet可以对Http请求进行相应并返回数据, 而Web Service只不过是基于SOAP协议和XML对数据进行封装了,也是采用Http协议来传输数据,后来通过慢慢阅读相关材料,加上实际操作,才发现Web Service和Servlet有很大区别,根本不是在一个层次上的东西,于是对于它们的区别进行总结 1. 整体概念 Servlet是Java对于Web开发而产生的一项技术,可以说Serv

Cisco IOS LAN Base、IP Base 和IP Service的区别

Details: http://www.cisco.com/c/en/us/products/collateral/switches/catalyst-3560-x-series-switches/white_paper_c11-579326.html The LAN Base feature set offers enhanced intelligent services that include comprehensive Layer 2 features, with up-to 255 V

启动service和绑定service的区别

当我们启动service的时候首先会调用 onCreate():然后调用onStartCommand()方法:再次启动service的时候只会调用onStartCommand()方法:因为只有一个服务! 这时候如果我们返回主界面服务正常运行: 我们绑定service的时候也会调用 onCreate():但是不会调用onStartCommand(): 如果绑定了service我们返回主界面的时候服务会直接抛出异常,并且执行ondestory方法():

WCF 、Web API 、 WCF REST 和 Web Service 的区别

The .Net framework has a number of technologies that allow you to create HTTP services such as Web Service, WCF and now Web API. There are a lot of articles over the internet which may describe to whom you should use. Now a days, you have a lot of ch