Android 关于使用 AlarmManager 的注意事项

AlarmManager 经常被用来执行定时任务,比如设置闹铃、发送心跳包等。也许有人会有疑问:为什么不能使用相同具有定时效果的 TimerHandler 呢?

其实答案非常简单,相对于 Handler 来说,使用 sendEmptyMessageDelayed 方法是依赖于 Handler 所在的线程的,如果线程结束,就起不到定时任务的效果;而 AlarmManager 依赖的是 Android 系统的服务,具备唤醒机制。比起 Handler 也就更合适了。

阅读更多

Android EventBus 源码解析

0001B

EventBus is a publish/subscribe event bus optimized for Android.

这是官方给的介绍,翻译:EventBus 是一种为 Android 而优化设计的发布/订阅事件总线。

0002B 使用方法

现在,来看一下 EventBus 的使用方法,直接复制粘贴 GitHub 中的例子:

阅读更多

Android ButterKnife 源码分析

0x01 前言

在程序开发的过程中,总会有一些场景需要去写重复冗余的代码,所以就出现了很多可以减少重复工作的框架或者工具。比如今天要分析的主角—— ButterKnife ,如果你做 Android 开发却没有听说过 ButterKnife 那就 Out 啦。ButterKnife 使用依赖注入的方式来减少程序员去编写一堆 findViewById 的代码,使用起来很方便。那么接下来就一步步地带你深入理解 ButterKnife 框架。

阅读更多

Android Volley 框架源码解析

0001B

在 2013 年的 Google I/O 大会上,Volley 网络通信框架正式发布。Volley 框架被设计为适用于网络请求非常频繁但是数据量并不是特别大的情景,正如它的名字一样。Volley 相比其他网络框架而言,采用了在 Android 2.3 以下使用 HttpClient ,而 Android 2.3 及以上使用 HttpUrlConnection 的方案。这是因为在 Android 2.3 以下时,HttpUrlConnection 并不完善,有很多 bug 存在。因此在 Android 2.3 以下最好使用 HttpClient 来进行网络通信;而在 Android 2.3 及以上,HttpUrlConnection 比起 HttpClient 来说更加简单易用,修复了之前的 bug 。所以在 Android 2.3 及以上我们使用 HttpUrlConnection 来进行网络通信。

阅读更多

Android Dynamic-Load-Apk 源码解析

0x00

趁着今天是周末,无所事事,来讲讲 Dynamic-Load-Apk 框架。Dynamic-Load-Apk 是任主席主导开发的一款插件化框架,其中心思想主要就是两个字——代理。和我之前分析的 android-pluginmgr 插件化框架不同的是,Dynamic-Load-Apk 框架完全基于在应用层上实现,并不依靠 ActivityThread 、Instrumentation 等。另外,Dynamic-Load-Apk 框架在插件化发展历程中诞生较早,对后来不断涌现的插件化框架具有深刻的指导意义。

阅读更多

Android 插件化框架 android-pluginmgr 解析

0x00 前言:插件化的介绍

所谓的插件化就是下载 apk 到指定目录,不需要安装该 apk ,就能利用某个已安装的 apk (即“宿主”)调用起该未安装 apk 中的 Activity 、Service 等组件(即“插件”)。

Android 插件化的发展到目前为止也有一段时间了,从一开始任主席的 dynamic-load-apk 到今天要分析的 android-pluginmgr 再到360的 DroidPlugin ,也代表着插件化的思想从顶部的应用层向下到 Framework 层渗入。最早插件化的思想是 dynamic-load-apk 实现的, dynamic-load-apk 在“宿主” ProxyActivity 的生命周期中利用接口回调了“插件” PluginActivity 的“生命周期”,以此来间接实现 PluginActivity 的“生命周期”。也就是说,其实插件中的 “PluginActivity” 并不具有真正 Activity 的性质,实质就是一个普通类,只是利用接口回调了类中的生命周期方法而已。比接口回调更好的方案就是利用 ActivityThread 、Instrumentation 等去动态地 Hook 即将创建的 ProxyActivity ,也就是说表面上创建的是 ProxyActivity ,其实实际上是创建了 PluginActivity 。这种思想相比于 dynamic-load-apk 而言,插件中 Activity 已经是实质上的 Activity ,具备了生命周期方法。今天我们要解析的 android-pluginmgr 插件化框架就是基于这种思想的。最后就是像 DroidPlugin 这种插件化框架,改动了 ActivityManagerService 、 PackageManagerService 等 Android 源码,以此来实现插件化。总之,并没有哪种插件化框架是最好的,一切都是要根据自身实际情况而决定的。

阅读更多

Android 日夜间模式实现的探讨

0x0001

关于 Android 的日间/夜间模式切换相信大家在平时使用 APP 的过程中都遇到过,比如知乎、简书中就有相关的模式切换。实现日间/夜间模式切换的方案也有许多种,趁着今天有空来讲一下日间/夜间模式切换的几种实现方案,也可以做一个横向的对比来看看哪种方案最好。

在本篇文章中给出了三种实现日间/夜间模式切换的方案:

  1. 使用 setTheme 的方法让 Activity 重新设置主题;
  2. 设置 Android Support Library 中的 UiMode 来支持日间/夜间模式的切换;
阅读更多

Android 《Android开发艺术探索》笔记二

第八章:理解Window和WindowManager

8.1 Window和WindowManager

Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可以创建Window。WindowManager是外界访问Window的入口,但是Window的具体实现是在WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。所有的视图例如Activity、Dialog、Toast都是附加在Window上的。因此,Window是实际上View的直接管理者。

阅读更多