我的应用程序有以下流程屏幕:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
现在我log out 在每个屏幕上都有一个公共按钮
(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)
我希望当用户点击退出按钮(从任何屏幕)时,所有屏幕都将完成,并且Log in将打开一个新屏幕.
我几乎尝试过所有FLAG_ACTIVITY这一切.我还在stackoverflow中查看了一些答案,但无法解决问题.我的应用程序是在Android 1.6上,因此无法使用FLAG_ACTIVITY_CLEAR_TASK
有什么方法可以解决这个问题吗?
是否可以在堆栈上启动活动,清除之前的整个历史记录?
情况
我有一个活动堆栈,可以是A-> B-> C或B-> C(屏幕A选择用户令牌,但许多用户只有一个令牌).
在屏幕C中,用户可以采取使屏幕B无效的动作,因此应用程序想要将它们带到屏幕A,而不管它是否已经在堆栈中.屏幕A应该是我的应用程序中堆栈上唯一的项目.
笔记
还有许多其他类似的问题,但我没有发现任何可以回答这个问题的问题.我试过调用getParent().finish()- 这总是导致空指针异常.FLAG_ACTIVITY_CLEAR_TOP仅在活动已在堆栈上时才有效.
在Android中我有一些活动,比方说A,B,C.
在A中,我使用此代码打开B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在B中,我使用此代码打开C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
当用户点击C中的按钮时,我想返回A并清除后栈(关闭B和C).因此,当用户使用后退按钮B和C将不会显示时,我一直在尝试以下内容:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
但是当我回到活动A时,如果我使用后退按钮,B和C仍然会出现.我怎么能避免这种情况?
我的应用程序中的所有活动都要求用户登录才能查看.用户几乎可以从任何活动中注销.这是应用程序的要求.在用户注销的任何时候,我都想将用户发送到Login Activity.此时我希望此活动位于历史堆栈的底部,以便按"后退"按钮可将用户返回到Android的主屏幕.
我已经看到这个问题问了几个不同的地方,都回答了类似的答案(我在这里概述),但我想在这里提出收集反馈.
我已经尝试通过设置其Intent标志来打开Login活动,FLAG_ACTIVITY_CLEAR_TOP这似乎是在文档中概述的,但是没有实现我将Login活动放在历史堆栈底部并阻止用户导航回来的目标以前看到的登录活动.我也尝试使用android:launchMode="singleTop"清单中的Login活动,但这也没有完成我的目标(并且似乎无论如何都没有效果).
我相信我需要清除历史堆栈,或者完成之前打开的所有活动.
一种选择是让每个活动onCreate检查登录状态,finish()如果没有登录.我不喜欢这个选项,因为后退按钮仍可供使用,当活动靠近时自动导航.
下一个选项是维护LinkedList对所有可以从任何地方静态访问的开放活动的引用(可能使用弱引用).注销时,我将访问此列表并迭代所有先前打开的活动,并finish()在每个活动上进行调用.我很快就会开始实施这种方法.
但是,我宁愿使用一些Intent标志技巧来实现这一目标.我很高兴发现我可以满足我的应用程序的要求,而不必使用我上面概述的两种方法中的任何一种.
有没有办法通过使用Intent或清单设置来实现这一点,或者是我的第二个选择,保持已LinkedList打开的活动是最佳选择?或者我还有另一种选择吗?
我在我的应用程序中有几个活动.并且流程非常复杂.当我单击Logout应用程序naviagates登录屏幕时,用户可以通过取消按钮退出(调用system.exit(0))
当我退出或退回按钮时,系统从堆栈调用一个活动:(当我到达登录界面时,如何清除堆栈中的所有活动?调用finish()是不切实际的,因为有很多活动,一些活动不应该关闭是活动的,如本机相机调用活动.
validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);
Run Code Online (Sandbox Code Playgroud) 我想结合两个意图标志,就像我们在android中所做的那样
Intent intent = new Intent(this, MapsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情,但它对我不起作用
val intent = Intent(context, MapActivity::class.java)
intent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
Run Code Online (Sandbox Code Playgroud) 我有一个A> B> C的任务堆栈.我目前在C上,然后我按下主页按钮.我收到通知,意图将我带到活动A.我按下通知,我在A但是如果我按回去,我会转到C,然后是B,然后是A.
我正在设置我的PendingIntent.有什么明显错误吗?
final Intent notificationIntent = new Intent(mContext, ActivityA.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent contentIntent = PendingIntent.getActivity(myContext, 0, notificationIntent, 0);
Run Code Online (Sandbox Code Playgroud)
编辑1:
我在这里尝试了这个建议:清除任务中的所有活动?
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)
但我仍然得到相同的结果.我的活动A在我的应用程序任务堆栈中开始,我按回去C,然后是B,然后是A.
我开始认为这在Android中是不可能的,或者在使用挂起的意图时是不可能的.
编辑2: 这不是需要什么标志的问题.更多的问题可能是错误的,标志似乎没有任何影响.
android android-intent android-notifications android-pendingintent
我有3个活动A,B和C. A导致B导致C.我希望能够在A和B之间来回移动但是我想在C开始后完成A和B. 我知道如何通过意图启动C时关闭B但是如何在C启动时关闭A?