Intent.Flag启动Activity必备

前言

在Android启动Activity时常用Intent,而Intent的flag能替代Activity的launchMode的效果,现在直接对Intent的flag进行分析,我们经常遇到以下场景:

  1. 登录成功、注册成功、绑定成功后启动新的常驻页(首页);
  2. 在常驻页启动了一系列页面后跳回常驻页,要求不创建新实例常驻页并且可刷新数据,或者清掉所有页建新的常驻页;
  3. APP未启动时从通知栏点击进入消息页,关闭消息页后进入常驻页;
  4. APP启动了从通知栏点击进入消息页,关闭消息页后进入常驻页,继续用原有栈的常驻页并刷新数据;
  5. 在栈中已有xAActivity,启动新的xAActivity或复用旧的xAActivity;
  6. sdk25以后支持快捷菜单启动Activity的情况。

细化且要注意的技术不同点在启动的Activity是否在栈中,在栈顶,同一个flags也会出现不同的效果,我们就观察栈的Activity是否新实例,是否要清栈。

真机测试

这次我做了严谨的数据测试,每一个结果都是根据栈数据得出的,下面给出测试方法:

准备工作:usb真机连接,打开编译器的Terminal后键入 adb shell,此时可操作常规权限的adb指令。本次主要代码在路径 cn.hwj.search.launch 业务代码

  1. 图标启动LoginActivity,点击login模拟成功登录跳转FirstActivity,finish自身;
  2. FirstActivity是常驻页,点击first跳转SecondActivity;
  3. 在SecondActivity点击second跳转ThirdActivity,此时要记录栈内Activity数据,在terminal中键入 dumpsys activity activities ,获取当前栈数据,会显示很多设备运行的栈数据,根据包名、类名等标识找到我们APP的栈数据,记录下来等会比较用;
  4. 在ThirdActivity模拟了多个测试跳转目的页面,配合对应的flags就是模仿我们的上面的6点场景,点击third启动测试的Activity,此时就terminal中键入 clear清掉数据,再键入 dumpsys activity activities ,获取当前栈数据,对比两次栈的不同,看使用对应flags是什么效果。

LoginActivity->FirstActivity->SecondActivity->ThirdActivity->测试Activity

还有一种是应用未启动,在长按快捷菜单(first,news)进入非常驻页,关闭非常驻页启动常驻页:
LongClick app icon->点击news菜单->在NewsActivity点击"消息通知"->启动常驻页FirstActivity

另一种应用启动且栈中有常驻页且有其他Activity在上面,通过在长按快捷菜单(first,news)进入常驻页,一般要的效果是清掉常驻页上的Activity。

系统版本高的栈数据非常大,还有大量的其他APP栈数据,要从中抽出测试APP的栈数据要比较耐心,低版本Android7我特意测了下有dumpsys后有2000个字符数据(>_<)。

下面贴下dumpsys的栈数据,每个flag的使用有2种前提,启动的xxActivity是否在栈中。在栈顶又会有栈顺序的不同,要完成代码里6种flag对比需要大量的测试数据,都是时间成本,没法减少(里面包名不同是贴到另一个项目跑):

task1.png

结论

在代码中有详细的解释,项目里的Action,广播都是为了验证Activity在不手动finish通过Intent.flags启动其他Activity时是否会销毁,也可以观察周期函数onDestroy(),其实只看栈数据的变量值就可以了,比较有用的是复用实例调onNewIntent()刷新数据或onRestart。

//首页、登录页 都有可能成为栈中唯一Activity
    //adb shell dumpsys activity activities   获取当前栈
    fun launchClear(context: Context = this, cls: Class<*>) {
        val intent = Intent(context, cls)
        //含有待启动Activity的Task在Activity被启动前清空,新实例;
        //栈中没启动过该Activity,会在本栈顶创建该新Activity
//        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP

        //含有待启动Activity的Task在Activity被启动前清空,不含也清空,新实例
//        intent.flags=Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK  //其他app拉起,每次调用都是新实例

        //含有待启动Activity但不置顶,清空启动Activity上的活动,而且创建新的实例
        //含有待启动Activity且置顶,清掉顶的Activity,创建新的实例
        //栈中没启动过该Activity,会在本栈顶创建该新Activity
//        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP  //常用突发的消息页,新闻页

        //含有待启动Activity但不置顶,清空启动Activity上的,但不创建新实例,调用onNewIntent()、onRestart
        //含有待启动Activity且置顶,不变,走 onNewIntent()
        //待启动不在栈中,不会清栈,在原本上新实例
        //总体来看和LaunchMode中的SingleTask在未定义android:taskAffinity属性时一致
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP   //常驻页,但数据要频繁更新

        //和LaunchMode的SingleTop一样,启动的Activity已置顶有就不变,但是走 onNewIntent()
        //启动的Activity在栈中但未置顶,在栈后创建新的实例
        //栈中没启动过该Activity,会在本栈顶创建该新Activity
//        intent.flags=Intent.FLAG_ACTIVITY_SINGLE_TOP  //常用突发的消息页,新闻页

        //复用栈中的Activity,该Activity会移到栈顶,栈顺序改变,调onNewIntent()
//        intent.flags=Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

        context.startActivity(intent)
    }

本文更新 2023/02/11
分享Intent.Flag启动Activity
分享混淆sdk技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值