Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有没有办法检测在按下后退按钮后将恢复哪些活动?_Android - Fatal编程技术网

Android 有没有办法检测在按下后退按钮后将恢复哪些活动?

Android 有没有办法检测在按下后退按钮后将恢复哪些活动?,android,Android,我的应用程序以活动A(登录屏幕)开始,我总是希望它位于活动堆栈的底部 基于登录后的一些逻辑,我启动了其他一些活动B-Z。应用程序中有一个菜单,允许您在任何活动B-Z之间切换 如果用户点击后退按钮的次数足够多,我不希望它们返回到登录屏幕。我希望用户被发送到Android主屏幕,如果在活动上按下后退按钮,那么该活动将活动A作为堆栈上的下一个活动。此活动不保证是活动A启动的活动,因为我的活动使用singleTop 想法 我唯一能想到的另一个选择是删除singleTop,活动A启动的任何活动都可以记住这

我的应用程序以活动A(登录屏幕)开始,我总是希望它位于活动堆栈的底部

基于登录后的一些逻辑,我启动了其他一些活动B-Z。应用程序中有一个菜单,允许您在任何活动B-Z之间切换

如果用户点击后退按钮的次数足够多,我不希望它们返回到登录屏幕。我希望用户被发送到Android主屏幕,如果在活动上按下后退按钮,那么该活动将活动A作为堆栈上的下一个活动。此活动不保证是活动A启动的活动,因为我的活动使用singleTop

想法

我唯一能想到的另一个选择是删除singleTop,活动A启动的任何活动都可以记住这一点(我的活动都派生自一个基类,我将使用它)

另一种可能是在onBackPressed处理程序中执行以下操作:


if(getParent().getClass().getName().equals(ActivityA.class.getName()){}
虽然不是您问题的直接答案,但如果问题是这样的话

我不希望它们返回到登录屏幕


然后,经典的解决方案是,当用户成功登录时,
finish()
登录
Activity
。通过这种方式,您可以确保用户永远不会返回到该
活动

要执行此操作,您为什么不获取用户登录信息,并将其存储在您的应用程序专用共享首选项中。然后,当用户启动应用程序时,您可以从活动A读取共享首选项,并自动将其登录到活动b

大概是这样的:

 SharedPreferences myPrefs = getBaseContext().getSharedPreferences("MyPrefs", SharedPreferences.MODE_PRIVATE);

 if((myPrefs.getString("username",null) != null) && (myPrefs.getString("password",null) !=null)){

   // Make sure your user is a member of your application

   // auto log in to the home page 
   Intent bIntent = new Intent(getBaseContext(), BIntent.class);
   startActivity(bIntent);

 }
有关如何使用共享首选项的更多参考信息

然后,如果您想变得非常流畅,请在每个活动中调用onDestroy()方法时存储类名,将每个类作为最后一个打开的活动覆盖。因此,在应用程序关闭之前,用户最后一次参与的任何活动都存储在首选项中,您可以在登录活动中读取这些活动,然后从中启动b-z


这将使登录活动始终位于内存中,因为它第一次启动是为了检查用户凭据。

我的问题是我希望堆栈上有ActivityA。如果我的应用程序中有一个Web服务返回,说用户不再登录,我将启动带有标志
的ACTIVITY\u CLEAR\u TOP
的ActivityA。由于ActivityA位于堆栈的底部,它将销毁顶部的所有活动,并将用户返回ActivityA(登录屏幕)。我不知道如果没有活动我是否能完成同样的事情A已经在堆栈的底部了,可以吗?@Andrew:
FLAG\u ACTIVITY\u CLEAR\u TOP
即使活动不在堆栈上也可以,如果你也使用
FLAG\u ACTIVITY\u SINGLE\u TOP
(或者,在你的情况下,在任何地方都使用
singleTop
,这很奇怪)。这里有一个指向可能帮助您解决问题的讨论的链接:。正如您将看到的,有一个干净的解决方案,不幸的是它只在API v11+上工作,还有一些聪明的黑客可以在任何Android上工作。谢谢大家的回复。我要读点书。不幸的是,我支持返回到版本8,因为有太多人仍在使用2.2/2.3。@Commonware、FLAG_ACTIVITY_SINGLE_TOP也要求该活动存在于堆栈上,并且仅当该活动实际位于堆栈顶部时才执行该作业。因此,如果活动先前已销毁,则FLAG_ACTIVITY_SINGLE_TOP和FLAG_ACTIVITY_CLEAR_TOP都将不起作用。是的,但仍然存在问题。假设登录活动打开Activity2。现在,在Activity2上,用户点击后退按钮。如果我知道登录活动之后的活动始终是Activity2,可以在
onBackPressed
中调用
moveTaskToBack(true)
,应用程序将最小化。但我不知道哪个活动将是登录活动之后的活动。它可以是任何活动。这就是为什么我需要知道如何确定这一点。在我的描述的最后,我提到在
SharedReferences
中跟踪当前视图。如果执行此操作,则可以在prefs中查询活动的唯一标识符并启动它。为每个活动添加sharedPrefs调用是一项小小的工作,但我认为这可能是一个有效的选择。