android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析

Android crash 流程详解(一):JE App crash(全称为 Application crash),又分 java crash 和 native crash,又称 java layer exception(JE) 和 native layer exception(NE对于 crash 在开发过程中或多或少都会遇到,本文将整理总结 crash 原理,剖析系统是如何捕捉、处理这些 crash。因为篇幅较长,所以会分JE 和 NE 两部分各自剖析。 阅读详情
AI摘要

本文探讨了Android应用开发中如何处理配置变化引发的Activity重新创建或onConfigurationChanged回调。作者通过源码分析,揭示了ActivityRelaunchItem在进程间通信中的角色,并详细讲解了`shouldRelaunchLocked`方法在决定Activity是否重启中的关键作用。核心在于理解configChanges的设置和Activity的重启策略。

hi,同学们大家好!

1、Configuration应用开发背景

今天要给大家分享内容就是我们应用开发时候经常会遇到问题,那就是如果系统一些属性变化了,比如语言,横竖屏幕,深色模式等。就会导致系统当前的TopActivity会进行destory后进行重新create情况。如果不想要reCreate Activity那么我们就需要到AndroidManifest中去声明对应的configChange,这个 时候就会让Activity不重新reCreate,即Activity可以不需要重建,但是Activity就会执行对应回调onConfigurationChanged。

在这里插入图片描述在这里插入图片描述

2、源码分析Activity的relaunch部分

这里 我们可以先分析Activity的reLaunch部分即Activity的重建
那怎么分析呢?
这里我们就以一些log线索来入手,因为大家知道源码分析的话因为源码太多,你得找到一个合适的切入点,不然确实分析源码基本等于大海捞针。
寻找切入点:
这里我们都是知道Activity重新创建会执行onDestroy,我们就在onDestroy进行堆栈拦截看看是哪里调用过来的。
在这里插入图片描述

这里很明显我们看出来了,其实是因为应用进程执行了ActivityRelaunchItem这个跨进程通信类,导致执行了对应的handleRelaunchActivityInner,再执行到handleDestroyActivity方法

那么这里其实 我们重点就应该放到具体服务端是哪里传递了ActivityRelaunchItem。

这里通过堆栈或者 调试方法 已经不起作用了,因为 是跨进程方式,当然无法追踪。
那就只能grep方式:
结果如下
在这里插入图片描述
明显我们就知道在ActivityRecord类中
在这里插入图片描述
这里调用其实是被 ensureActivityConfiguration调用的

具体调用栈:
在这里插入图片描述
这里就有个疑问了,config变化了难道就一定要进行relaunch么?这个就是我们接下来要分析的
onConfigurationChanged情况

3、源码分析非relaunch情况,执行onConfigurationChanged情况

前面我们已经知道config变化后就2种情况
1 Activity重启
2 Activity不进行重启,但要进行AndroidManifest的声明,然后会会回调onConfigurationChanged的方法

直接重启和Manifest中声明的差异到底在哪里呢?

    boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow,
            boolean ignoreVisibility) {
            //省略

        if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) {
          //省略
            if (mState == PAUSING) {
                deferRelaunchUntilPaused = true;
                preserveWindowOnDeferredRelaunch = preserveWindow;
                return true;
            } else {
      //省略
                relaunchActivityLocked(preserveWindow);
                }
                            // All done...  tell the caller we weren't able to keep this activity around.
            return false;
            }
  // Default case: the activity can handle this new configuration, so hand it over.
        // NOTE: We only forward the override configuration as the system level configuration
        // changes is always sent to all processes when they happen so it can just use whatever
        // system level configuration it last got.
        if (displayChanged) {
            scheduleActivityMovedToDisplay(newDisplayId, newMergedOverrideConfig);
        } else {
            scheduleConfigurationChanged(newMergedOverrideConfig);
        }

        return true;
    }

这里其实就可以看出来执行scheduleConfigurationChanged其实最后就会导致Activity的onConfigurationChanged的执行
但是前面shouldRelaunchLocked如果为true,那么就会导致Activity的重启

故问题关键变成了 shouldRelaunchLocked方法

/**
     * When assessing a configuration change, decide if the changes flags and the new configurations
     * should cause the Activity to relaunch.
     *
     * @param changes the changes due to the given configuration.
     * @param changesConfig the configuration that was used to calculate the given changes via a
     *        call to getConfigurationChanges.
     */
     //这里就判断十分会导致Activity进行重启,根据changes这个值与manifet中值比较
    private boolean shouldRelaunchLocked(int changes, Configuration changesConfig) {
    //这里 非常关键会获取和activity相关的configChange,其实也就是manifest中声明的那些
        int configChanged = info.getRealConfigChanged();
        boolean onlyVrUiModeChanged = onlyVrUiModeChanged(changes, changesConfig);
//省略

        return (changes&(~configChanged)) != 0;//这里会进行比较,如果不再manifest,则返回true
    }

那么来看看info.getRealConfigChanged();具体实现情况:

public int getRealConfigChanged() {
    return applicationInfo.targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB_MR2
            ? (configChanges | ActivityInfo.CONFIG_SCREEN_SIZE
                    | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE)
            : configChanges;
}

这里其实就是ActivityInfo类中的configChanges变量
那么configChanges变量又是哪来的呢?
在这里插入图片描述

其实在包解析时候就已经进行了获取

Android笔记之:onConfigurationChanged详解 从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: 代码如下:android:configChanges=”orientation|keyboard|keyboardHidden”  通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、 立即下载

相关推荐

【芯片验证随心记】1.SystemVerilog中,rand和randc的区别?如何用constraint实现randc?

在SystemVerilog里,randc 的“不重复循环”特性是用一个 周期性排列器(permutation engine) 实现的,而这个引擎在 LRM 里并没有公开。我们只能在 “用户空间” 用 rand + constraint 去模仿它的行为。每次随机化只取 queue.pop_front(),用完再洗。在4次随机化内,y会依次出现0,1,2,3各一次(顺序随机)每次随机化,x可能是0-3中的任意值,可能连续多次相同。每次随机化时,在未使用的值里随机挑一个;第5次随机化时,重新生成新的排列周期。

qq_43172512的博客 342

Android 11----View.onConfigurationChanged详解

这里写自定义目录标题目录新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目录 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下M

肥鸟21号的博客 7763

嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板

想要把qt工程放到开发板上运行,就需要用到交叉编译。由于qt是跨平台的,所以只需要换个编译器编译一下就可以。 以“定时器”的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时候,电脑屏幕很大,但是运行的窗口只有一点点大,开发板也有外接屏幕,如何让运行窗口自动适配开发板的外接屏幕呢?令其占满屏幕显示,而不是一小块。 第一步:需要设置一下,先给ui布局,如果不布局,控件就不会随着屏幕的大小的变化而变化。 第二步:利用代码来获取屏幕的大小,给widget.cpp文件下添加如下代码 #inclu

qq_42822743的博客 5457

android onConfigurationChanged讲解

本文来自http://blog.youkuaiyun.com/liuxian13183/,引用必须注明出处! 相信大家对这个属性已经耳熟能详,如果大家受过转屏的折磨的话! 老...

weixin_34269583的博客 568

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1739

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

android语言切换的源码逻辑

android语言的分发,会通过AMS去分发,AMS中保存着正在运行的进程,并分别分发给各个进程,各个进程在收到对应的事件的时候,会重启当前的页面,来应用config的改变,页面重启的过程中,Resource会读取当前的config,根据保存的语言属性,加载不同语言资源文件夹下的String资源,实现语言的切换 流程 1,预言切换的入口为LocalePicker类,他会和AMS通讯,把本地配置通过...

weixin_40273792的博客 1060

SPMI协议学习总结

SPMI(System Power Management Interface)是由MIPI(Mobile Industry Processor Interface)联盟定义的一种硬件接口标准,它主要用于移动设备中,连接SoC(System on Chip)处理器系统的集成电源控制器与一个或多个电源管理IC(PMIC),以实现精确的电源管理

歌颂苦难的行为是无耻的; 1082

Android中的onConfigurationChanged的使用

设备配置发生变化的时候调用,比如:内外屏切换、屏幕方向(orientation)、键盘状态(keyboard)、语言环境(locale)、屏幕布局(screenlayout)等。这个时候旋转手机屏幕,会发现只会重新走一遍activity的创建过程,不会走onConfigurationChanged这个回调。这个时候旋转屏幕,就不会走activity的销毁重建步骤了,只会走onConfigurationChanged这个回调。

xiaokang666的博客 4249

YOLO26全新改进 | 最全损失函数改进篇 | SIoU 、WIoU、GIoU、DIoU、EIOU、CIoU, InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

🔥本文详细介绍了如何修改YOLO26中的损失函数。首先提供了完整的损失函数核心代码,包括WIoU_Scale类和各种IoU计算方法。然后分三步指导修改:1)替换metrics.py中的bbox_iou方法;2)修改loss.py中的iou计算代码;3)更新tal.py中的相关代码。文中特别强调了修改损失函数应在模型结构调整后使用,并提供了多种IoU损失函数的参数配置建议,包括SIoU、WIoU、GIoU等,可根据实际需求灵活选择搭配使用。

Ai缝合怪、助力小伙伴高效发论文 450

RDKit | 基于Pytorch和RDKit建立QSAR模型

QSAR 定量构效方法(quantitative structure-activity relationship, QSAR)是应用最为广泛的药物设计方法。所谓定量构效方法就是通过一些数理统计方法建立其一系列化合物的生理活性或某种性质与其物理化学性质之间的定量关系,通过这些定量关系。可以预测化合物的生理活性或某些性质,指导我们设计出具有更高活性的化合物。 早在...

DrugOne 5078

2021-09-03 eventlog对应各标识表示的含义

当前联想设备路径 /system/etc/event-log-tags eventlog中各标识表示的含义 当前看的比较多的标识 am_pss 42 answer (to life the universe etc|3) 314 pi 1003 auditd (avc|3) 1004 chatty (dropped|3) 1005 tag_def (tag|1),(name|3),(format|3) 1006 liblog (dropped|1) 2718 e 2719 ...

qq_34024778的博客 5059

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

perseverance51博客 5786

[FAQ09104]进入应用界面后发现会闪屏,此时要如何定位是否是relaunch activity引起的闪屏呢

[DESCRIPTION] 进入应用界面后发现会闪屏,此时要如何定位是否是relaunch activity引起的闪屏呢? [SOLUTION] 1 对于这类问题,抓取log时记得要打开AMS的log开关: adb shell dumpsys activity log a on 2 请在main log里搜索Relaunching关键字,看下这个Activity是否有被Relau

欢迎加入Android老司机学院 482266514(技术交流群)密码优快云 1982

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android onConfigurationChanged 基础配置

当用户将设备从竖屏旋转到横屏,或者从横屏旋转到竖屏时,系统会检测到屏幕方向的配置变化。在这种情况下,方法会被调用,使得开发者可以在该方法中对布局进行重新调整,以适应新的屏幕方向。例如,对于一个新闻阅读应用,竖屏时文章内容可能以单列形式显示,而在横屏时可以将文章内容和相关图片以双列形式更好地呈现。 在Activity类中重写onConfigurationChanged方法 在Activity类中重写方法来处理屏幕方向改变后的逻辑。以下是一个简单的示例代码: 在上述代码中,当屏幕方向改变时,方法会被调

嗯... 3801

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android activity详细启动调用

本文基于android 28 源码 android.app.androiThread.java 在androidThread 中的 H 类收到消息RELAUNCH_ACTIVITY 后会调用 handleRelaunchActivityLocally方法,在这个方法的最后一句话调用了executeTransaction, 可以通过按 f3 进入到ActivityThrea...

u010945409的博客 2191

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Activity生命周期

本文生命周期流转的部分,主要集中在app端,在ams部分只有简单的涉及hl=zh-cnonCreate()onStart()onResume()onPause()onStop()

lizhenjun114的专栏 1562

Android开发中onConfigurationChanged()不起作用

解决Android开发中onConfigurationChanged()不起作用

weixin_42387575的博客 2812

Android屏幕旋转后的变更--ConfigChange

在android开发中,有一个容易被忽视但其实很重要的问题:屏幕旋转后的页面重建。本文将介绍下当屏幕旋转后,页面生命周期的变化以及如何防止页面重建带来的问题。

fxjzzyo的博客 5342

Android R: updateConfiguration()的relaunch App流程

updateConfiguration()的relaunch App流程 在这里插入代码片 切换系统语言更新Configuration frameworks/base/core/java/com/android/internal/app/LocalePicker.java public static void updateLocales(LocaleList locales) { try { IActivityManager am = ActivityManager.getServi

月山知了的博客 2183

Configuration Change派发到App进程

其它Activity会在下次resume的时候再触发relaunch,跟上面两个不在同一线程以及同一时间执行,如果想查找relaunch的具体原因,需要向前时间查找对应的configuration_changed的log,具体参考https://blog.youkuaiyun.com/xiaoyantan/article/details/126292133。针对Activity级别的处理,relaunch当前Activity或触发当前Actiivty回调onConfigurationChanged方法,只会发生其一。

xiaoyantan的博客 1308

Android 如何从onConfigurationChanged中判断是语言发生了变化

ps:mLastConfig对象不能直接通过getResources().getConfiguration()赋值 ,需通过new Configuration(getResources().getConfiguration())的方式获取。通过Configuration#diff(Configuration delta)方法,会返回新旧值差异的int值,再通过位运算即可知道对应项是否变化。但如果onConfigurationChanged回调时,我们是否可以知道到底是哪个配置发生了改变呢?

leaf_fei的博客 2132

Activity启动流程详解

1.Android程序流程众所周知,我们的java程序想要开启需要依赖于main方法,也就是我们的程序入口(主线程)进入,但是在我们日常开发android程序的过程当中我们并没有发现main方法的存在,那么android当中的是如何开始运行的?熟悉的朋友们可能都知道在android当中存在一个叫做ActivityThread的类,这个类代表的是android当中的主线程,而在这个类当中我们看到了比...

ABang的博客 2954

android:configChanges分析

在ensureActivityConfiguration,首先得到此次发生的配置改变值0x2004,值存储在变量changes,然后调用shouldRelaunchLocked,判断是否能内部消化掉这次改变。这些事件一旦发生,当前活动的Activity会重新启动,其中的过程是:在销毁之前会先调用onSaveInstanceState()方法去保存你应用中的一些数据,然后调用onDestroy()方法,最后调用onCreate()、onStart()、onResume()等方法启动一个新的Activity。

l309681481的博客 4097
上一篇: Android跨进程通信Client Crash后Server端onDestroy
下一篇: Android 12中系统Wallpaper详解1--锁屏透看壁纸和桌面透看壁纸的切换
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值