一.为什么会说到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(...)方法循环发送闹钟广播,接收的时候调用serviceonstart方法

第三点:服务的声明周期:

service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的方式:

一种方式:

  被开启的service通过其他组件调用startService()被创建。

  这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。

  当service被停止时,系统会销毁它。

另外一种:

  被绑定的service是当其他组件(一个activity)调用bindService()来创建的。

  activity可以通过一个IBinder接口和service进行通信。

  activity可以通过unbindService()方法来关闭这种连接。

  一个service可以同时和多个activity绑定,当多个activity都解除绑定之后,系统会销毁service



更多相关文章

  1. Android(安卓)  Fragmnet的使用新体会
  2. android ViewFlipper使用示例(注册引导页)
  3. APK权限大全 - Android必懂知识
  4. Android(安卓)4.0 input touch解析(一)
  5. android 数据储存——--文件存储(2)
  6. 安卓Android手机系统内文件夹目录解释
  7. Android跨进程通信IPC之3——Bionic
  8. android Dialog 全屏的方法
  9. 超简单的几行代码搞定Android底部导航栏功能

随机推荐

  1. android : 深入理解intent-filter的actio
  2. Android(安卓)Update Engine分析(七) Downl
  3. Fatal signal 11 (SIGSEGV) at 0xdeadbaa
  4. android adb shell命令行启动Activity se
  5. Android(安卓)studio添加按钮点击进入下
  6. Ubuntu 12.04中Android(安卓)NDK r8d 编
  7. Android更新UI的两种方法——handler与ru
  8. android通过HTTP协议上传文件至远程服务
  9. Anroid使用DefaultHttpClient访问Wap网络
  10. WebView的基本使用方法及 WebViewClient