前言

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

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

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

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

2021年04月11日 framework
阅读更多...

内存

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

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

栈(stack)

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

堆(heap)

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

方法区(method)

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

2021年04月04日 性能优化
阅读更多...
2021年03月10日 Jetpack
阅读更多...

若无明示源码版本,全文以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应该就是维持程序一直运行的关键。

2021年03月08日 Framework
阅读更多...

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

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

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

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

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

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

2021年03月07日 Jetpack
阅读更多...

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

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

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

2021年02月28日 Jetpack
阅读更多...

前言

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

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

Lifecycle是什么?

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

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

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

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

2021年02月25日 Jetpack
阅读更多...

前言

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

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

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

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

2021年02月24日 Jetpack
阅读更多...

源码篇 - 广播接收者

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

2021年02月15日 Jetpack
阅读更多...

目录


源码篇

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

2021年02月06日 Jetpack
阅读更多...