Android总是清除后台堆栈

Android总是清除后台堆栈,android,back-stack,Android,Back Stack,关于这个话题,这里有很多问题,但没有一个答案适合我。我正在编写一个将携带敏感数据的应用程序,因此我希望用户每次进入应用程序时都能登录。我已经尝试了singletask启动模式和clearTaskOnLaunch,并且我使用exclude from Recents属性从“Recents Apps”隐藏任务 但现在,应用程序的“后退”按钮的行为与应有的不同 例如: LoginActivity>MainActivity>HelpActivity 现在用户按下Home按钮,因为应用程序不在recents

关于这个话题,这里有很多问题,但没有一个答案适合我。我正在编写一个将携带敏感数据的应用程序,因此我希望用户每次进入应用程序时都能登录。我已经尝试了singletask启动模式和clearTaskOnLaunch,并且我使用exclude from Recents属性从“Recents Apps”隐藏任务

但现在,应用程序的“后退”按钮的行为与应有的不同

例如:

LoginActivity>MainActivity>HelpActivity

现在用户按下Home按钮,因为应用程序不在recents列表中,所以用户需要使用launcher图标。LoginActivity会按预期弹出,但如果用户按下“后退”按钮,它将转到Helpactivity,而不是退出应用程序

Edit:我已经找到了解决方案,问题是我在启动
MainActivity
之后调用了
LoginActivity
上的
finish()
。因此,当点击启动器时,Android系统正在重新设置活动的父项,将新实例化的
LoginActivity
放在堆栈的顶部,而不是清除它,只留下根活动,因为没有此类活动。

您尝试过清单中的noHistory选项吗?
Have you tried noHistory option in manifest?
Also you can implement this by the use of SharedPreferences:
public void onPause(){
    super.onPause();
        Context context = getApplicationContext();
                ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
                List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                if (!taskInfo.isEmpty()) {
                  ComponentName topActivity = taskInfo.get(0).topActivity; 
                  if (!topActivity.getPackageName().equals(context.getPackageName())) {

                    Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP. ", Toast.LENGTH_SHORT).show();
//Here you can maintain a boolean value in sharedpreferences stating everytime you leave and login into the app. 


                  }
                }
      }
您还可以通过使用SharedReference来实现这一点: 公共无效暂停(){ super.onPause(); Context=getApplicationContext(); ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_服务); List taskInfo=am.getRunningTasks(1); 如果(!taskInfo.isEmpty()){ ComponentName topActivity=taskInfo.get(0).topActivity; 如果(!topActivity.getPackageName().equals(context.getPackageName())){ Toast.makeText(xYourClassNamex.this,“您离开了应用程序。”,Toast.LENGTH\u SHORT.show(); //在这里,您可以在SharedReferences中维护一个布尔值,说明您每次离开并登录应用程序的时间。 } } }

下面是链接:

发布您的清单请确认,这样我可以知道用户是否离开我的应用程序,这将是清除堆栈的适当时机,但如何操作?在更高的API上,我可以使用
finishafinity()
,但我的minSdk是8。为什么要在sharedprefs中存储布尔值?我不会在任何时候和任何活动中得到它,如果您当时按home按钮离开应用程序,您可以将该值设置为true,稍后通过检查该标志,您可以决定是否再次登录。