Service和IntentService的区别

Service和IntentService的区别

参考:

http://blog.qiji.tech/archives/2693

http://blog.csdn.net/guolin_blog/article/details/11952435

http://www.jianshu.com/p/332b6daf91f0

 

service:

api概念:

1.  Service不是一个单独的进程 ,它和应用程序在同一个进程中。


2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作。如果有耗时操作在Service里,就必须开启一个单独的线程来处理!

相对于activity来说,Service主要负责需要长期运行的任务。只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。

Thread仅仅对创建它的Activity负责,而Service是所有的Activity都可以Service进行关联。

生命周期

Service和IntentService的区别_第1张图片

onCreate->onStartCommand->onBind->onDestroy

 

Service分类

Service按照启动过程分类:

分为直接启动startService和绑定启动bindService。

当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经销毁了。

当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行。同时,当activity销毁时与其绑定的service也会同时被销毁。

startService启动的服务优缺点:优点是一旦服务开始就会一直执行,直到被内存回收或者调用了stopService;缺点是activity无法与service进行数据交互;

bindService启动的服务优缺点:优点是activity可以和service进行交互;缺点是随着activity销毁,自己也会销毁;

为了能够满足又能与activity交互,又能在activity销毁后继续存活,我们这里可以这样启动:


如果要关闭服务我们既要unbindservice又要stopservice;

具体的内容参看:我的《安卓基础8:服务与Aidl》

 

 

Service按照进程类型:

分为local-service和remote-service;local运行的位置就是主进程。而remote-service运行的位置是一个新的进程。

local-service比较简单,不赘述了。

Remote-service因为是运行在另外一个新的进程里面,所以这里就涉及到跨进程通信。为了实现跨进程通信,我们采用Aidl来实现。

 Service和IntentService的区别_第2张图片

申明远程service:

Service和IntentService的区别_第3张图片

创建aidl接口

 Service和IntentService的区别_第4张图片

在remote中返回实现接口并将其binder对象返回出去:

Service和IntentService的区别_第5张图片

在activity中开启服务,并通过返回的binder对象进行接口调用:

 Service和IntentService的区别_第6张图片

IntentService:

概念:

IntentService 是继承自 Service 并处理异步请求的一个类,在IntentService 内有一个工作线程来处理耗时操作,当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,执行完自动结束。

使用:

Service和IntentService的区别_第7张图片

通过intentService模拟下载图片服务;

Service和IntentService的区别_第8张图片

源码:

注册服务:

activity使用服务

Service和IntentService的区别_第9张图片

服务:

Service和IntentService的区别_第10张图片

注意:

IntentServiceI与activity的交互都是通过广播完成的!

 

源码:

Service和IntentService的区别_第11张图片Service和IntentService的区别_第12张图片 

通过源码我们发现intentService中是通过HeaderThread来管理线程的,并且onBind返回的喂null。所以完全没办法和它进行直接交互。

 

 

 

 

 

 

你可能感兴趣的:(安卓进阶)