android – 在注销时,清除活动历史记录堆栈,阻止“后退”按钮打开仅登录的活动
作者:互联网
我的应用程序中的所有活动都要求用户登录才能查看.用户几乎可以从任何活动中注销.这是应用程序的要求.在任何时候,如果用户注销,我想将用户发送到登录活动.此时我希望此活动位于历史堆栈的底部,以便按“后退”按钮可将用户返回到Android的主屏幕.
我已经看到这个问题问了几个不同的地方,都回答了类似的答案(我在这里概述),但我想在这里提出收集反馈.
我已经尝试通过将其Intent标志设置为FLAG_ACTIVITY_CLEAR_TOP来打开Login活动,这似乎是在文档中概述的,但是没有实现我将Login活动放在历史堆栈底部并且阻止用户导航回以前看到的登录活动.我也尝试使用android:launchMode =“singleTop”作为清单中的Login活动,但这也没有实现我的目标(并且似乎无论如何都没有效果).
我相信我需要清除历史堆栈,或者完成之前打开的所有活动.
一个选项是让每个活动的onCreate检查登录状态,如果没有登录则完成().我不喜欢这个选项,因为后退按钮仍可供使用,当活动靠近时自动导航.
下一个选项是维护一个LinkedList,引用所有可以从任何地方静态访问的打开活动(可能使用弱引用).注销时,我将访问此列表并迭代所有先前打开的活动,在每个活动上调用finish().我很快就会开始实施这种方法.
但是,我宁愿使用一些Intent标志技巧来实现这一目标.我很高兴发现我可以满足我的应用程序的要求,而不必使用我上面概述的两种方法中的任何一种.
有没有办法通过使用Intent或manifest设置来实现这一点,或者是我的第二个选择,维护已打开活动的LinkedList是最佳选择吗?或者我还有另一种选择吗?
解决方法:
我可以建议你另一种方法恕我直言更健壮.
基本上,您需要向需要保持登录状态的所有活动广播注销消息.因此,您可以使用sendBroadcast并在所有Actvities中安装BroadcastReceiver.
像这样的东西:
/** on your logout method:**/
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);
接收者(安全活动):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**snip **/
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.package.ACTION_LOGOUT");
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("onReceive","Logout in progress");
//At this point you should start the login activity and finish this one
finish();
}
}, intentFilter);
//** snip **//
}
标签:android,android-lifecycle,activity-lifecycle 来源: https://codeday.me/bug/20190915/1804828.html