如何返回上一个Activity?跳转后返回键失效问题求助
嗨,我来帮你拆解下问题出在哪哈~
首先看你这段代码:
Intent intent = new Intent().setClass(v.getContext(), WinnerDetailActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); v.getContext().startActivity(intent); ((Activity)context).finish();
问题核心就出在最后一行的((Activity)context).finish();!
为什么返回键回不去上一个Activity?
Android是靠任务栈来管理Activity的,假设当前显示的是Adapter所在的Activity(咱们叫它A),当你启动WinnerDetailActivity(叫它B)后,任务栈原本是[A, B]——但你立刻调用finish()把A销毁了,栈里就只剩[B]了。这时候按返回键,系统发现栈里没有上一个Activity可以返回,自然就直接退出应用了。
针对你的需求的解决方案
你说“希望两个Activity不会同时运行”,得先明确你要的是哪种“不同时运行”,对应不同的处理方式:
1. 启动B后A彻底销毁,但返回时要回到A之前的页面
如果A不是应用的根Activity(比如A是从别的页面C跳过来的),那你的代码逻辑本身没问题——销毁A后,任务栈会变成[C, B],按返回键会回到C。但如果A是应用启动的第一个页面,那销毁后栈里只剩B,返回肯定会退出,这时候就得调整你的页面跳转逻辑了。
2. 启动B后保留A,按返回键能回到A,且B不会被重复创建
如果你想要的是“B启动后A仍然存在,返回能回到A,且重复点击跳转不会创建多个B实例”,那直接删掉((Activity)context).finish();这行代码就行。FLAG_ACTIVITY_SINGLE_TOP的作用是:如果B已经在栈顶,再次跳转时不会创建新的B实例,而是调用B的onNewIntent()方法。这时候任务栈是[A, B],按返回键就能正常回到A了。
3. 整个应用中只存在一个B实例
如果你的需求是不管B在栈的哪个位置,整个应用都只有一个B实例,那FLAG_ACTIVITY_SINGLE_TOP就不够了,应该换成FLAG_ACTIVITY_SINGLE_TASK(或者在AndroidManifest里给B设置launchMode="singleTask")。这时候如果B已经在栈中存在,系统会把它上面的所有Activity销毁,让B回到栈顶并调用onNewIntent()。
- 若你不想A存在:保留
finish(),但返回时回不去A; - 若想返回A:删掉
finish()即可。
小提醒
Activity启动模式的选择一定要贴合你的实际业务场景,乱用反而容易导致任务栈管理混乱,出现意料之外的页面跳转问题哦~
内容的提问来源于stack exchange,提问作者podgradle

