热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

四大组件:Activity生命周期Android12

篇首语:本文由编程笔记#小编为大家整理,主要介绍了四大组件: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 :


  1. ActivityThread继承的是ClientTransactionHandler
  2. ClientLifecycleManager.java/ClientTransaction.java --> TransactionExecutor.java/ClientTransactionHandler.java
  3. 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


  1. LaunchActivityItem、ResumeActivityItem都继承BaseClientRequest.java,基本处理preExecute、execute、postExecute
  2. 关注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 待续


推荐阅读
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Docker系列 七. Docker 安装Jenkins
    Docker系列七.Docker安装JenkinsJenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作 ... [详细]
  • 记一次线上环境的内存溢出(java.lang.OutOfMemoryError)
    事故背景今天客户说风控项目有个别用户查询不到数据不是报错就是一直卡在那里,我就去那个接口看了下。一看项目日志今天的都几个g了,平常也就几百兆吧ÿ ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • TerraformVersionTerraformv0.10.6AffectedResource(s)Pleas ... [详细]
author-avatar
KingDragon龙帝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有