android延迟执行优化(安卓开机自启动管理)

android延迟执行优化(安卓开机自启动管理)

  首先,需要明确一点,Handler 延时消息机制不是延时发送消息,而是延时去处理消息;举个例子,如下:

  上面的 Handler 不是延时3秒后再发送消息,而是将消息插入消息队列后等3秒后再去处理。

  postDelayed 的方法如下:

  其中的 getPostMessage 就是将 post 的 runnable 包装成 Message,如下:

  sendMessageDelayed 方法如下:

  sendMessageAtTime 如下:

  这里面的代码很好理解,就不说了,看看 enqueueMessage:

  MessageQueue 的 enqueueMessage 的方法如下:

  举个例子,假设我们消息队列是空的,然后我发送一个延时10s的延时消息,那么会直接把消息存入消息队列。

  从消息队列中获取消息是 通过 Looper.loop() 来调用 MessageQueue 的 next()方法,next()的主要代码如下:

  其实,从这里就可以看出来,Handler 的延时消息是如何实现的了。

  比方说 发送一个延时10s的消息,那么在 next()方法是,会阻塞 (10s + 发送消息时的系统开机时间 – 执行next()方法是系统的开机时间),到达阻塞时间时会唤醒。或者这时候有新的消息来了也会 根据 mBlocked=true来唤醒。

  在 MessageQueue 类中有一个 static 的接口 IdleHanlder:

  当MessageQueue中无可处理的Message时回调; 作用:UI线程处理完所有事务后,回调一些额外的操作,且不会堵塞主进程;

  接口中只有一个 queueIdle() 函数,线程进入堵塞时执行的额外操作可以写这里, 返回值是true的话,执行完此方法后还会保留这个IdleHandler,否则删除。

推荐阅读