目录


源码篇

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

SystemJobService

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

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

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

目录


源码篇

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

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

目录


源码篇

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

SystemForegroundService

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

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

源码篇 - 广播接收者

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

2021年02月15日 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
阅读更多...