service与IntentService 区别

关系:

  IntentService继承service

区别:

  IntentService 是一个带有HandlerThread的线程的service,把任务执行完成以后IntentService自动销毁。

  Service要手动 调用stopSelf()来销毁。

  IntentService 运行在子线程中,Service运行在主线程中

作用:

   IntentService 用于执行一次复杂的场景使用IntentService相对好一点

  Service 用于重复执行的场景

代码分析:

  IntentService 运行在子线程中,Service运行在主线程中

  MyService 继承Service

 1 package com.example.activitynate;
 2
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.IBinder;
 6
 7 public class MyService extends Service {
 8
 9     @Override
10     public IBinder onBind(Intent intent) {
11         return null;
12     }
13
14     @Override
15     public int onStartCommand(Intent intent, int flags, int startId) {
16         System.out.println("MyService ===== 所在的线程   "+Thread.currentThread());
17         return super.onStartCommand(intent, flags, startId);
18     }
19 }

MyIntentService 继承IntentService

 1 package com.example.activitynate;
 2
 3 import android.app.IntentService;
 4 import android.content.Intent;
 5
 6 public class MyIntentService extends IntentService {
 7
 8     public MyIntentService(String name) {
 9         super(name);
10
11     }
12     public MyIntentService() {
13         this("lihao");
14     }
15
16     @Override
17     protected void onHandleIntent(Intent intent) {
18         System.out.println("MyIntentService ===== 所在的线程   "+Thread.currentThread());
19     }
20
21
22
23 }

运行结果:

04-07 00:41:58.245: I/System.out(5107): MyService ===== 所在的线程 Thread[main,5,main]
04-07 00:41:58.255: I/System.out(5107): MyIntentService ===== 所在的线程 Thread[IntentService[lihao],5,main]

为什么MyIntentService  会在IntentService[lihao]这个线程中

 1 public abstract class IntentService extends Service {
 2     private volatile Looper mServiceLooper;
 3     private volatile ServiceHandler mServiceHandler;
 4     private String mName;
 5     private boolean mRedelivery;
 6
 7     private final class ServiceHandler extends Handler {
 8         public ServiceHandler(Looper looper) {
 9             super(looper);
10         }
11
12         @Override
13         public void handleMessage(Message msg) {
14             onHandleIntent((Intent)msg.obj);
15             stopSelf(msg.arg1);
16         }
17     }
18
19     /**
20      * Creates an IntentService.  Invoked by your subclass‘s constructor.
21      *
22      * @param name Used to name the worker thread, important only for debugging.
23      */
24     public IntentService(String name) {
25         super();
26         mName = name;
27     }
28
29
30     public void setIntentRedelivery(boolean enabled) {
31         mRedelivery = enabled;
32     }
33
34     @Override
35     public void onCreate() {
36         // TODO: It would be nice to have an option to hold a partial wakelock
37         // during processing, and to have a static startService(Context, Intent)
38         // method that would launch the service & hand off a wakelock.
39
40         super.onCreate();
41         HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
42         thread.start();
43
44         mServiceLooper = thread.getLooper();
45         mServiceHandler = new ServiceHandler(mServiceLooper);
46     }
47
48     @Override
49     public void onStart(Intent intent, int startId) {
50         Message msg = mServiceHandler.obtainMessage();
51         msg.arg1 = startId;
52         msg.obj = intent;
53         mServiceHandler.sendMessage(msg);
54     }
55
56
57     @Override
58     public int onStartCommand(Intent intent, int flags, int startId) {
59         onStart(intent, startId);
60         return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
61     }
62
63     @Override
64     public void onDestroy() {
65         mServiceLooper.quit();
66     }
67
68     /**
69      * Unless you provide binding for your service, you don‘t need to implement this
70      * method, because the default implementation returns null.
71      * @see android.app.Service#onBind
72      */
73     @Override
74     public IBinder onBind(Intent intent) {
75         return null;
76     }
77
78
79     protected abstract void onHandleIntent(Intent intent);
80 }

从源代码的41-45行中 IntentService 中维护了一个HandlerThread 和一个Handler 很容易看到我们继承的IntentService的线程的名字

由于HandlerThread是个子线程start以后生成了loop传给Handler所以Handler运行在子线程里面然后,Handler发送消息,,接收到消息以后

会调用handleMessage()方法这个方法里面又调用了onHandleIntent(),这个方法执行完成后调用stopSelf() 13-14行代码,Service将自动销毁。

时间: 2024-10-14 04:10:08

service与IntentService 区别的相关文章

Service和IntentService中显示Toast的区别

1. 表象 Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. 原因 Toast要求运行在UI主线程中. Service运行在主线程中,因此Toast是正常的. IntentService运行在独立的线程中,因此Toast不正常. 3. 在IntentService中显示Toast 利用Handler,将显示Toast的工作,放在主线程中来做.具体有两个实现方式. Ha

Service与IntentService

之前介绍了Android Service与Thread的区别(点击查看Service与Thread区别),由于Service不是线程,它是在主线程中运行的,因此在Service中应该避免耗时操作,之前看到过很多帖子和代码都把耗时操作交给Service去处理,这样是不合理的.如果Service中有耗时操作一定要new 一个Thread去处理.        下面写一个错误的示例,即将耗时操作直接放在Service中进行. //Servicepublic class MyService extend

Spring注解@Component、@Repository、@Service、@Controller区别

Spring注解@Component.@Repository.@Service.@Controller区别 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

WCF、WebAPI、WCF REST、Web Service之间的区别

在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对Web Service.WCF以及Web API的看法. Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用 4.它只能部署在IIS上 WCF 1.这个也是基于SOAP的,数据格式是XML 2.这个是We

Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系

Atitit.如何实现dip, di ,ioc  ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的区别1 4. Service Locator模式1 5.  Service Locator vs. Dependency Injection2 6. 参考2 1. Dip原则又来自于松耦合思想方向 松耦合系统的好处有两点:一点是它适应变化的灵活性:另一点是当某个服务的内部结构和实现逐渐发生改变时,不

Android中Service与IntentService的使用比较

不知道大家有没有和我一样,以前做项目或者 练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于 IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得. 首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方: 1.A Service is not a separate process.

Android自学之路——Service与IntentService

A)MainActivity部分的代码1 package com.example.cms.intentservice; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class

<转> service和Thread区别 加深印象。

原文链接 http://blog.csdn.net/imstephen/article/details/20299941 我们知道,一般情况下,一个应用程序对应一个进程,当然也有例外,比如在一个应用程序中打开浏览器时,这时就产生了另一个进程,也就是浏览器的进程.这时,当我们关闭了该应用之后,会发现该应用的进程并没有被销毁.实际上,由于这些应用是用于手机上的,用户可能会频繁使用这些应用,谷歌工程师为了提高我们使用这些应用的效率,当我们关闭一个应用时,只是将界面关闭了,并没有将其进程彻底杀死. 这样

WCF、Net remoting、Web service概念及区别

Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK). WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM.Remoting.Web Service.WSE.MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准. WCF是建立在.Net Framework 2.0基础之上的,包含在.NET 3.0/3.5