时间轴
2021
  • 04-11

    前言

    Activity一般是安卓开发接触到的第一个重要组件,代表着与用户交互的活动视窗,活动与活动之间往往不是相互独立的,startActivity()就是从一个活动跳转到另一个活动的桥梁。而对于startActivity()的了解,我们往往只停留在它的使用上,很少去深究它的原理

    今天,就让我们跟随着源码,一步一步的追溯它的调用流程,初步了解下它的调用链,后续我们还可以继续挖掘,关于应用启动、启动模式、hook启动流程等相关技术支持。

    此系列博客在未声明API版本情况下,将使用API30 版本的AndroidSDK源码。

    源码查看工具使用AndroidStudio。源码来源%AndroidSDK%/sources。一般方式:备份一份source目录,使用AndroidStudio Open你想观察的api版本的源码目录。

  • 04-04

    内存

    JAVA是在JVM所虚拟出的内存环境中运行的,JVM的内存可分为三个区:

    堆(heap)、栈(stack)和方法区(method)。

    栈(stack)

    是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out, 后进先出),栈中只存放基本类型和对象的引用

    堆(heap)

    堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。

    方法区(method)

    又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量

  • 03-10

    LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

    【本系列文章(JAVA/KOTLIN)演示案例均存储在github存储库ArchitecturalComponentExample中】

    【如需参考LiveData官方文档请移步此处】

  • 03-08

    若无明示源码版本,全文以Android API23为准分析

    从何开始

    如何解释:我写的Java代码是如何在手机上一直运行着的?

    首先,显而易见的,作为一个Java程序,一定有一个程序入口main(String[] args), 那么Android程序的入口main()在哪里呢,我们用 Source Insight查找一下,最终我们在android.app.ActivityThread中找到了它的身影。

    让我们来看一下ActivityThread.main()到底干了些啥:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //{@link android.app.ActivityThread}
    public static void main(String[] args) {
    // ... something for environment & log

    Looper.prepareMainLooper();

    // init ActivityThread; ActivityManager.attachApplication
    // init Instrumentation; ContextImpl.createAppContext
    // context.mPackageInfo.makeApplication; application.onCreate
    // and so on ...

    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    且先不看程序是如何初始化环境以及是如何从ActivityThread开始一步步启动application的,我们都知道Java程序终有执行完的一刻,那么app是如何保证在手机不爆炸的情况下一直运行不退出的?手痒用Java JFrame、JPanel的做过小游戏的朋友应该就想到了:无限循环刷新!

    可是肉眼看过去,这里别说死循环,连个for都没有,怎么肥四?

    所幸,我们发现了一组特别的单词 【Looper】(翻译:打环装置)和 【loop】(翻译:循环电影胶片;重复指令),显然Looper应该就是维持程序一直运行的关键。

  • 03-07

    ViewModel这个名称常常使人误解为MVVM中的ViewModel层,那么它是不是同一个东西呢?

    ViewModel可以作为MVVM中的ViewModel层,但不是特指MVVM中的ViewModel层。

    ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

    它是一个独立的组件,你可以把它视作生命周期相关的数据存储工具, 把它用在你觉得合适的任意地方,它可以是Fragment共享数据的桥梁、可以是屏幕方向切换时的数据来源、当然也可以是 MVVM 中 ViewModel层的 数据提供者,你可以使用LiveData让它变成可观察的数据,也可以使用DataBinding让他成为View的数据源

    【本系列文章(JAVA/KOTLIN)演示案例均存储在github存储库ArchitecturalComponentExample中】

    本篇所述源码及代码基于 API 30

  • 02-28

    上一篇文章中我们讲了Jetpack之生命周期感知组件-Lifecycle使用篇,接下来我们来看一下他是如何工作的吧。

    在了解其工作原理前,我们需要先简单了解以下ActivityThread对Activity生命周期的分发流程,以便理解Lifecycle的工作原理。

    此篇前半部分将讲述API26及API30生命周期分发流程,后半部分依照前半部分对照讲述Lifecycle生命周期分发时机,最后将介绍Lifecycle源码执行流程及ProcessLifecycleOwner是如何实现应用前后台监听的。

  • 02-25

    前言

    什么是生命周期感知组件?

    生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。

    Lifecycle是什么?

    Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

    它所解决的痛点问题是什么?

    在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 工作原理的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄漏甚至应用崩溃。

    【本系列文章(JAVA/KOTLIN)演示案例均存储在github存储库ArchitecturalComponentExample中】

  • 02-24

    前言

    应用程序启动库StartUp提供了一种在应用程序启动时初始化组件的简单、高效的方法。库开发者和应用开发者都可以使用app Startup来简化启动序列,并显式设置初始化顺序。

    不同于为每个需要初始化的组件定义单独的内容提供程序,App Startup允许你定义共享单个内容提供程序的组件初始化程序。这可以显著提高应用程序的启动时间。

    此组件主要解决的痛点问题是:简化各个外部引用SDK初始化操作,并优化SDK初始化时机,在确保启动速度的情况下以更优更稳定的方式按需初始化SDK(当然,也可以利用它的按需按序执行的功能来初始化某些类)。

    【本系列文章演示案例均存储在github存储库ArchitecturalComponentExample中】

  • 02-15

    源码篇 - 广播接收者

    此篇将重点介绍WorkManager使用的重要组件:广播接收者,主要涉及意外停止监听广播ForceStopRunnable.BroadcastReceiver、约束状态监听广播ConstraintProxy.*、启动重新规划服务的广播RescheduleReceiver、代理约束更新广播ConstraintProxyUpdateReceiver、测试诊断广播DiagnosticsReceiver。此类组件为WorkManager稳定运行、重新规划、约束更新提供了支持。

  • 02-06

    目录


    源码篇

    上一篇中我们简单使用了WorkManager的一般功能,基础使用还是比较简单的。“WorkManager 是一个 API,可供您轻松调度那些即使在退出应用或重启设备后仍应运行的可延期异步任务”。那么我们来了解一下他到底是怎么工作的吧。

  • 02-06

    目录


    ZERO

    Q: 什么是WorkManager?为什么要使用它?

    WorkManager 是一个 API,可供您轻松调度那些即使在退出应用或重启设备后仍应运行的可延期异步任务。WorkManager API 是一个适合用来替换先前的 Android 后台调度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler)的组件,我们也建议您这样做。WorkManager 在其现代、一致的 API 中整合了其前身的功能,该 API 支持 API 级别 14,在开发时即考虑到了对电池续航的影响。

    Q: 一定要使用WorkManager吗?

    如果您的应用以 Android 10(API 级别 29)或更高版本为目标平台,那么您对 FirebaseJobDispatcher 和 GcmNetworkManager API 的调用在搭载 Android Marshmallow (6.0) 及更高版本的设备上将无法正常工作。

    由上一问题可知,WorkManager是对 FirebaseJobDispatcher 和 GcmNetworkManager API 的替换,在一定情境下,显然更推荐您使用WorkManager。


    本章主要内容为WorkManager基本使用及源码分析,涉及WorkManager入门使用、源码分析两个部分,可根据个人需要选择部分内容阅读。

    本章所述WorkManager相关内容均基于WorkManager:2.4.0;

    本章涉及代码内容均使用Java语言编写,Java版本1.8;

    本章演示项目地址:https://github.com/TinloneX

    参考官方文档请点击这里

  • 02-06

    目录


    源码篇

    前面从work-runtime库的AndroidManifest.xml中了解到,WorkManager工作主要通过ContentProvider、Service、BroadcastReceiver协同工作,而关注几个主要Service工作流程发现,最终都会执行到Processor.startWork()方法,此篇将重点关注Processor.startWork()是何方神圣。

  • 02-06

    目录


    源码篇

    上一篇中我们简单使用了WorkManager的一般功能,基础使用还是比较简单的。“WorkManager 是一个 API,可供您轻松调度那些即使在退出应用或重启设备后仍应运行的可延期异步任务”。那么我们来了解一下他到底是怎么工作的吧。

    SystemJobService

    Service invoked by {@link android.app.job.JobScheduler} to run work tasks.

    服务将被JobScheduler调用来执行工作任务。
    从描述可得SystemJobServiceSystemAlarmService职责是一致的,都是“run work tasks”。

  • 02-06

    目录


    源码篇

    上一篇中我们了解了WorkManager使用的的主要组件,猜测了各个组件的作用,并简单介绍了WorkManager是如何初始化的。本篇将延续前文,介绍WorkManager中Service组件之一的SystemAlarmService。

    SystemAlarmService

    Service invoked by {@link android.app.AlarmManager} to run work tasks.

    服务将被AlarmManager调用来执行工作任务.

  • 02-06

    目录


    源码篇

    上一篇中我们了解了WorkManager使用的的主要组件,猜测了各个组件的作用,并简单介绍了WorkManager是如何初始化的。本篇将延续前文,介绍WorkManager中Service组件之一的SystemForegroundService。

    SystemForegroundService

    在看过前面SystemAlarmService & SystenJobService 后,我本以为
    SystemForegroundService也如前者一般是处理任务执行的,但简单阅读代码后发现并非如此,尽管结构上与前者类似,但其主要作用是给运行任务的服务提权,保证其在前台执行