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进行关联。
生命周期
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:
创建aidl接口
在remote中返回实现接口并将其binder对象返回出去:
在activity中开启服务,并通过返回的binder对象进行接口调用:
IntentService:
概念:
IntentService 是继承自 Service 并处理异步请求的一个类,在IntentService 内有一个工作线程来处理耗时操作,当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,执行完自动结束。
使用:
通过intentService模拟下载图片服务;
源码:
注册服务:
activity使用服务
服务:
注意:
IntentServiceI与activity的交互都是通过广播完成的!
源码:
通过源码我们发现intentService中是通过HeaderThread来管理线程的,并且onBind返回的喂null。所以完全没办法和它进行直接交互。