作者:KingDragon龙帝 | 来源:互联网 | 2023-09-17 11:25
篇首语:本文由编程笔记#小编为大家整理,主要介绍了四大组件:Activity生命周期-Android12相关的知识,希望对你有一定的参考价值。四大组件:Acti
篇首语:本文由编程笔记#小编为大家整理,主要介绍了四大组件:Activity生命周期-Android12相关的知识,希望对你有一定的参考价值。
四大组件:Activity生命周期-
android12
Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。在java编程范式中,应用是通过 main() 方法启动的,而 Android 系统与此不同,它会调用与其生命周期特定阶段相对应的特定回调方法来启动 Activity 实例中的代码。
1. Activity生命周期
1.1 Activity生命周期方法说明
android官网 了解 Activity 生命周期
回调 | 描述 |
---|
onCreate() | 必须实现此回调,它会在系统创建您的 Activity 时触发。您的实现应该初始化 Activity 的基本组件:例如,您的应用应该在此处创建视图并将数据绑定到列表。最重要的是,您必须在此处调用 setContentView() 来定义 Activity 界面的布局。 |
onStart() | onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。 |
onResume() | 系统会在 Activity 开始与用户互动之前调用此回调。此时,该 Activity 位于 Activity 堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在 onResume() 方法中实现的。 |
onPause() | 当 Activity 失去焦点并进入“已暂停”状态时,系统就会调用 onPause() 。例如,当用户点按“返回”或“最近使用的应用”按钮时,就会出现此状态。当系统为您的 Activity 调用 onPause() 时,从技术上来说,这意味着您的 Activity 仍然部分可见,但大多数情况下,这表明用户正在离开该 Activity,该 Activity 很快将进入“已停止”或“已恢复”状态。
如果用户希望界面继续更新,则处于“已暂停”状态的 Activity 也可以继续更新界面。例如,显示导航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,用户仍希望其界面继续更新。
您不应使用 onPause() 来保存应用或用户数据、进行网络呼叫或执行数据库事务。 |
onStop() | 当 Activity 对用户不再可见时,系统会调用 onStop() 。出现这种情况的原因可能是 Activity 被销毁,新的 Activity 启动,或者现有的 Activity 正在进入“已恢复”状态并覆盖了已停止的 Activity。在所有这些情况下,停止的 Activity 都将完全不再可见。
系统调用的下一个回调将是 onRestart() (如果 Activity 重新与用户互动)或者 onDestroy() (如果 Activity 彻底终止)。 |
onRestart() | 当处于“已停止”状态的 Activity 即将重启时,系统就会调用此回调。onRestart() 会从 Activity 停止时的状态恢复 Activity。
此回调后面总是跟着 onStart() 。 |
onDestroy() | 系统会在销毁 Activity 之前调用此回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包含该 Activity 的进程时释放该 Activity 的所有资源。 |
1.2 Activity.java流程源码对照
AMS:startActivity桌面启动应用、应用内部启动startActivity-Android12、Activity相关初始化-Android12
-
Activity -- Instrumentation -- AMS/ATMS – Instrumentation – Activity
回调基本都是perform
打头的方法:
Android中Binder
用于不同进程之间通信
-
Instrumentation.java 与之对应的是callActivity
打头的方法:
-
ActivityThread中调用Instrumentation;Android P
之后对应各种ActivityLifecycleItem
Android P 上新增 Android P Basic lifecycle transaction containers
:
ActivityThread
继承的是ClientTransactionHandler
ClientLifecycleManager.java/ClientTransaction.java --> TransactionExecutor.java/ClientTransactionHandler.java
- ClientTransaction中添加各种流程
ActivityLifecycleItem
,执行execute()
最终调用的也是 class ActivityThread extends ClientTransactionHandler
中方法。将原先class H extends Handler
中处理转移到了,替换EXECUTE_TRANSACTION
执行mTransactionExecutor.execute(transaction)
。
1.3 Event相关日志
通常比较关注的是wm_on_resume_called
,表示已经准备完成,界面显示了
frameworks/base/core/java/android/app/EventLogTags.logtags
# See system/core/logcat/event.logtags for a description of the format of this file.
option java_package android.app
# Do not change these names without updating the checkin_events setting in
# google3/googledata/wireless/android/provisioning/gservices.config !!
#
# The activity's onPause has been called.
30021 wm_on_paused_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onResume has been called.
30022 wm_on_resume_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onStop has been called.
30049 wm_on_stop_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onCreate has been called.
30057 wm_on_create_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onRestart has been called.
30058 wm_on_restart_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onStart has been called.
30059 wm_on_start_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onDestroy has been called.
30060 wm_on_destroy_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onActivityResult has been called.
30062 wm_on_activity_result_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onTopResumedActivityChanged(true) has been called.
30064 wm_on_top_resumed_gained_called (Token|1|5),(Component Name|3),(Reason|3)
# The activity's onTopResumedActivityChanged(false) has been called.
30065 wm_on_top_resumed_lost_called (Token|1|5),(Component Name|3),(Reason|3)
2. 启动应用:LaunchActivityItem、ResumeActivityItem
如图,启动应用时添加ClientTransaction
中添加了LaunchActivityItem、ResumeActivityItem
LaunchActivityItem、ResumeActivityItem
都继承BaseClientRequest.java
,基本处理preExecute、execute、postExecute
- 关注
mTransactionExecutor.execute(transaction)
处理:
public void execute(ClientTransaction transaction)
executeCallbacks(transaction);
executeLifecycleState(transaction);
1》executeCallbacks(transaction)
中transaction.getCallbacks()有LaunchActivityItem
执行调用ActivityThread.handleLaunchActivity()
,通过mInstrumentation.callActivityOnCreate()
响应Activity.OnCreate()
,执行后状态设置为ActivityClientRecord r.setState(ON_CREATE)
2》executeLifecycleState(transaction)
中当前状态start = ON_CREATE, finish = ON_RESUME
,中间缺少ON_START
,所以cycleToPath()
中间状态mTransactionHandler.handleStartActivity()
,响应Activity.OnStart()
;最后执行请求ResumeActivityItem
(即执行ActivityThread.handleResumeActivity()
),响应Activity.OnResume()
2.1 启动应用流程截图
3 其他流程XXXActivityItem
待续