需求:从其他模块, 目前有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。灵活性差。
网友评论