Android中IntentService和HandlerThread的分析
一.为什么会说到IntentService和HandlerThread
在Android中,主线程不能执行耗时操作,将耗时操作一般在子线程中执行,上一篇中我们分析和异步任务类的源码和执行过程,出去异步任务外常见的充当子线程的还用IntentService和HandlerThread.
关于异步任务类上一篇中说的很是详细,主要分析其余的两种.IntentService和HandlerThread都是直接使用了线程,不是线程池.还用就是IntentService是一个Service(服务),并且内部使用的就是HandlerThread,而HandlerThread继承了Thread,不同之处就是,这个线程可以使用Handler.
二.由于IntentService使用到了HandlerThread,我们先分析HandlerThread
public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; // 其他代码}
我们看到其实就是一个线程,这个线程能够使用Handler,那就有一个消息循环系统,我们看到了Looper,
在细看里面的run()方法:
@Overridepublic void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1;}我们看到了run()中准备了一个Looper,我们从Android消息机制中可知,Looper创建会在内部new MessageQueue并且获取当前的线程,不然不能创建Handler,其次使用looper()开启了消息循环.这样就可以在
HandlerThread中使用Hnadler构建消息机制了!
三.IntentService的源码分析:
既然是一个服务,我们顺便区别一下子和一般服务的区别:
1.第一点:Service的理解
Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念。
那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR,为了解决这样的问题,引入了IntentService
2.第 二点:关于IntentService
IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期。
那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去执行耗时操作
IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。
IntentService有以下特点:
(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4) 默认实现的onBind()返回null
(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; 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); } }//其他代码}我们看到IntentSerive是一个服务,里面ServiceHandler(就是一个Handler);再看OnCreate()源码:
@Overridepublic 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);}我们在onCreate()中看到一个ServiceHnadler(就是Handler)和一个HandlerThread.
优势: IntentSerive可用来执行后台耗时操作任务,任务执行后会自动关闭,本身是一个服务,导致了他的优先级比普通的线程的优先级高很多,不容易被后台杀死,更加时候高优先级的后台任务.
四:Service的相关知识点
第一点:Service中的onStartCommond四种返回值策略
分别描述一下四个返回值含义:
START_STICKY
如果service进程被kill掉,保留service的状态为开始状态,但不保留传递的intent对象。
随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。
如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY
“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT
重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY
START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
强调一下系统默认的使用策略:
public intonStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mStartCompatibility ?START_STICKY_COMPATIBILITY : START_STICKY;
}
可见,默认的策略是START_STICKY,支持服务意外终止重新创建的。
第二点:service被kill之后怎么让它重启
1. 在onStartCommand方法中将flag设置为START_STICKY;2. 在xml中设置了android:priority3. 在onStartCommand方法中设置为前台进程4. 在onDestroy方法中重启service5. 用AlarmManager.setRepeating(...)方法循环发送闹钟广播,接收的时候调用service的onstart方法
第三点:服务的声明周期:
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的方式:
一种方式:
被开启的service通过其他组件调用startService()被创建。
这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。
当service被停止时,系统会销毁它。
另外一种:
被绑定的service是当其他组件(一个activity)调用bindService()来创建的。
activity可以通过一个IBinder接口和service进行通信。
activity可以通过unbindService()方法来关闭这种连接。
一个service可以同时和多个activity绑定,当多个activity都解除绑定之后,系统会销毁service更多相关文章
- Android(安卓) Fragmnet的使用新体会
- android ViewFlipper使用示例(注册引导页)
- APK权限大全 - Android必懂知识
- Android(安卓)4.0 input touch解析(一)
- android 数据储存——--文件存储(2)
- 安卓Android手机系统内文件夹目录解释
- Android跨进程通信IPC之3——Bionic
- android Dialog 全屏的方法
- 超简单的几行代码搞定Android底部导航栏功能
随机推荐
- android : 深入理解intent-filter的actio
- Android(安卓)Update Engine分析(七) Downl
- Fatal signal 11 (SIGSEGV) at 0xdeadbaa
- android adb shell命令行启动Activity se
- Android(安卓)studio添加按钮点击进入下
- Ubuntu 12.04中Android(安卓)NDK r8d 编
- Android更新UI的两种方法——handler与ru
- android通过HTTP协议上传文件至远程服务
- Anroid使用DefaultHttpClient访问Wap网络
- WebView的基本使用方法及 WebViewClient