其他分享
首页 > 其他分享> > android – 在注销时,清除活动历史记录堆栈,阻止“后退”按钮打开仅登录的活动

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