美文网首页
android 清除回退栈并回到初始页面

android 清除回退栈并回到初始页面

作者: 王家匀匀 | 来源:发表于2020-12-10 19:57 被阅读0次

需求:从其他模块, 目前有2个入口,可以跳到一个功能模块。入口场景1和2,可能会经过activity E,也可能直接到购买起始页activity A, 直到D完成整改购买流程。 从D可以跳转到E。activity E 可以跳到 A。 要求, 无论 中间 购买几次, 最后从E返回 ,总是回到起始来源 场景1和2的入口activity。
并且要求,在中间页面,比如B\C ,又可以逐级返回。

简单画个流程图:


image.png

中间的甲、乙页面,是必须返回,才能进入其它页面,没有二级页面。 不是本需求的重点。所以只讨论A--E页面。

直接上答案:

step1: 清单文件,activity 定义时,设置单独进程:taskAffinity 。

这里需要设置 activity A\B\C\D\E. 为相同的taskAffinity 。

     <activity android:name=".YourActivity"
            android:screenOrientation="portrait"
            android:taskAffinity=".yourfunction.task"/>

至于为什么要用finishAffinity方法,可以查看源码。
代码注释说明:会关闭这个activity,并且立即关闭当前这个activity栈下面的activity。

    /**
     * Finish this activity, and tries to finish all activities immediately below it
     * in the current task that have the same affinity.
     *
     * <p>On Android 4.1+ calling this method will call through to the native version of this
     * method. For other platforms {@link Activity#finish()} will be called instead.</p>
     */
    public static void finishAffinity(@NonNull Activity activity) {
        if (Build.VERSION.SDK_INT >= 16) {
            activity.finishAffinity();
        } else {
            activity.finish();
        }
    }

step2: D -> E'.关闭finishAffinity。在D中跳转E'

   // 清除购买流程中所有页面(包含E,其它模块activity继续保留)
            ActivityCompat.finishAffinity(this)
            //重新打开E,一定要设置flag,避免 E 创建多个实例(多次发起支付并完成,每次都会留下 E)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            startActivity(intent)

step3:E 返回时,只要关闭自己 finish 即可。同时 设置 OnNewIntent,使得每次打开时刷新数据。

方案1:
为什么不只使用 FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP。
原因:返回时还要回来最初来源的页面,不能把所有的页面都关闭(即清空整个栈)

方案2:
为什么不设置activity ,不保留历史。这样不就无法返回中间页面了吗?

    <activity
            android:name=".YourActivity"
            android:screenOrientation="portrait"
            android:noHistory="true"/>

原因:需求是完成整个购买流程返回时跳过中间过渡页面,但是在中间过程中依然需要保留页面,可以返回上一级。

方案3:
为什么不使用 传参,标记来源的方式?
原因:层级太深,不适合逐级传参。并且可以反复购买,容易引起来源错乱。

方案4:为什么不使用startActivityForResult 并且在onActivity中关闭当前页面?
原因:同样是页面层级过深。并且不好扩展。

方案5:怎么不使用 启动模式,代码还简单?
原因:额,不符合需求。启动模式针对的还是打开特定页面,而不是关闭特定页面(关闭A以及后面所有页面,如果A前面有E还要再关闭E)。 这里如果我 打开A,并且关闭A上面所有页面,那么返回时,A和上面可能存在的E就无法关掉。而且场景2不经过E,直接到A。

方案6:怎么不使用任务栈 获取任务列表。
原因:android获取任务栈没有ios那么方便,一方面有权限问题,一方面也不能轻易获取到activity。灵活性差。

总结,这里最关键的就是 ActivityCompat.finishAffinity(activity) 方法。关闭任务中全部activity.

相关文章

网友评论

      本文标题:android 清除回退栈并回到初始页面

      本文链接:https://www.haomeiwen.com/subject/uyergktx.html