Android应用从浏览器唤起Activity后回退直接退出问题及解决方案咨询
我从自己的应用中启动浏览器,网页上有个按钮,点击后会通过特殊URL唤起我的应用里的
IncreaseCreditActivity。但这个Activity启动后,按下返回键应用就直接退出了,我不想让应用关闭。我猜测是之前的应用实例消失了,这个猜测对吗?有什么解决方案?我的Activity配置代码:
<activity android:name=".IncreaseCredit.IncreaseCreditActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="test" android:host="successpayment"/> <data android:scheme="test" android:host="unsuccesspayment"/> </intent-filter> </activity>启动浏览器的代码:
Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url));
你的猜测完全正确!
当通过浏览器的URL唤起IncreaseCreditActivity时,系统会为这个Activity创建一个全新的应用任务栈。而原来的应用实例所在的任务栈,可能因为后台停留时间较长被系统回收,或者在启动浏览器时没有被正确保留,导致当你按下返回键时,新任务栈里只有这一个Activity,返回后任务栈为空,应用自然就直接退出了。
给你几个靠谱的解决方案:
1. 给Activity设置singleTask启动模式(最推荐)
修改你的Activity配置,添加launchMode="singleTask",默认情况下应用所有组件的taskAffinity都是应用包名,所以无需额外设置就能和原应用共用同一个任务栈:
<activity android:name=".IncreaseCredit.IncreaseCreditActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="test" android:host="successpayment"/> <data android:scheme="test" android:host="unsuccesspayment"/> </intent-filter> </activity>
singleTask模式会让系统先检查是否存在该Activity所属的任务栈:如果存在,就把整个任务栈带到前台,把这个Activity放到栈顶(栈里已有实例就直接复用,没有则新建);如果不存在才会创建新任务栈。这样按下返回键时,就会回到原应用的上一个页面,而不是直接退出。
2. 手动重写返回键逻辑,跳转回原页面
如果不想修改启动模式,也可以在IncreaseCreditActivity里重写返回键的行为,直接跳回你应用的主页面或者之前的页面:
@Override public void onBackPressed() { // 把MainActivity替换成你想要返回的目标页面 Intent intent = new Intent(this, MainActivity.class); // 清除目标Activity之上的所有页面,确保栈结构正确 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); // 关闭当前的IncreaseCreditActivity }
3. 启动浏览器时保留原任务栈状态
在启动浏览器的Intent里添加FLAG_ACTIVITY_RETAIN_IN_RECENTS标记,让系统更倾向于保留原应用的任务栈:
Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); i.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); startActivity(i);
不过这个方法的效果不如前两个稳定,更适合作为辅助手段。
内容的提问来源于stack exchange,提问作者Mohammadreza Borjian

