专栏首页Android 开发学习添加Intent.FLAG_ACTIVITY_CLEAR_TOP 都做了些什么背景整体流程

添加Intent.FLAG_ACTIVITY_CLEAR_TOP 都做了些什么背景整体流程

背景

最近老是看到各种面试中的lanchMode和Intent Flag, 大多数分析停留在表面, 并且有些还自相矛盾。lz 最近 做一个需求需要用Intent flag, 查阅了下相关资料, 并从源码论证了原因。添加Intent.FLAG_ACTIVITY_CLEAR_TOP我们来看看系统是怎么做的? 别问我怎么找到源码的,我不告诉你是通过androidxref查找的。

整体流程

private int startActivityUnchecked 整体的逻辑就在这个函数中了,逻辑也比较清楚,

  1. setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, voiceInteractor); 初始化lauchMode和Intent Flags
  2. computeLaunchingTaskFlags();
  3. computeSourceStack();
  4. mReusedActivity = getReusableIntentActivity(); 查找可复用的activity
  5. 特殊Flag处理如本文的 FLAG_ACTIVITY_CLEAR_TOP
 private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
1025            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
1026            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {
1027
1028        setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
1029                voiceInteractor);
1030
1031        computeLaunchingTaskFlags();
1032
1033        computeSourceStack();
1034
1035        mIntent.setFlags(mLaunchFlags);
1036
1037        mReusedActivity = getReusableIntentActivity();
1038
1039        final int preferredLaunchStackId =
1040                (mOptions != null) ? mOptions.getLaunchStackId() : INVALID_STACK_ID;
1041
1042        if (mReusedActivity != null) {
                       ......
1066            if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
1067                    || mLaunchSingleInstance || mLaunchSingleTask) {
1068                // In this situation we want to remove all activities from the task up to the one
1069                // being started. In most cases this means we are resetting the task to its initial
1070                // state.
1071                final ActivityRecord top = mReusedActivity.task.performClearTaskForReuseLocked(
1072                        mStartActivity, mLaunchFlags);
1073                if (top != null) {
1074                    if (top.frontOfTask) {
1075                        // Activity aliases may mean we use different intents for the top activity,
1076                        // so make sure the task now has the identity of the new intent.
1077                        top.task.setIntent(mStartActivity);
1078                    }
1079                    ActivityStack.logStartActivity(AM_NEW_INTENT, mStartActivity, top.task);
1080                    top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent,
1081                            mStartActivity.launchedFromPackage);
1082                }
1083            }
1084
 .......  //中间为嘛省略呢? 与我们主题讨论的Intent.FLAG_ACTIVITY_CLEAR_TOP 相关度不大,其他的flag处理
1250    }

直接到第4步

image.png

注释很详细,不多说了,处理lanchMode和flag

第5步 处理FLAG_ACTIVITY_CLEAR_TOP

image.png

主要是查找到对应的activity记录,从后往前遍历,模拟栈操作,然后找到目标activity, 将该activity栈顶的activity finish掉。 最后处理Activity, 如果不含有singletop 的intent flag 就finish掉该activity。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最近需要做的事技术上需要实践的

    用户1127566
  • 属性动画源码分析分析版本api 24

    用户1127566
  • Android Architecture Components 之LiveData, ViewModel

    用户1127566
  • Python实现简单的视频人脸检测识别,人工智能入门基础!

    其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统、人脸动态跟踪识别系统等等。

    python学习教程
  • 在线可以解决的问题,我从不安装客户端的

    哈喽各位小伙伴早,不知道大家会不会因为需要用一次P图软件,而下载几百甚至几G大型的大型软件就为了P一张图。

    IT小侠公社
  • 扩展GridView控件——为内容项添加拖放及分组功能

    引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项。打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现Gri...

    葡萄城控件
  • 中兴通讯吉晓威:中兴通讯Elastic SD-WAN应用剖析

    中兴通讯的工程师吉晓威先生演讲:中兴通讯Elastic SD-WAN应用剖析,大家可以把阿里云和中兴的方案放在一起看一下他们的界限在什么地方。

    SDNLAB
  • 走近源码:神奇的HyperLogLog

    HyperLogLog是Redis的高级数据结构,是统计基数的利器。前文我们已经介绍过HyperLogLog的基本用法,如果只求会用,只需要掌握HyperLog...

    Jackeyzhe
  • 为什么Python类语法应该不同?

    如果您已经使用了任何编程语言很长一段时间,您就会发现您想要的东西跟它原有的是不同的。Python对我来说是真的是这样。如果可以的话,对于Python中很多的我想...

    小小科
  • 如何在Ubuntu 18.04上使用Nginx反向代理配置Jenkins SSL

    默认情况下,Jenkins自带内置的Winstone Web服务器监听端口8080方便入门。但是,使用SSL保护Jenkins以保护通过Web界面传输的密码和敏...

    灬半痴

扫码关注云+社区

领取腾讯云代金券