【问题标题】:clean stack and exit app onBackPressed()清理堆栈并退出应用程序 onBackPressed()
【发布时间】:2012-05-12 18:43:33
【问题描述】:

基本上,我的应用程序有一个 loginScreen,一旦登录,您就可以进行许多活动。当我按下主页按钮时,应用程序进入后台,如果用户在一定时间内没有打开它,用户会话将关闭并且你返回到 loginScreen。现在的问题是,如果我想在会话过期后从 loginScreen 关闭应用程序,我按返回键,它应该关闭,但它没有。它把我带到堆栈中的前一个元素。

连线的事情是,在所有 onBackPressed() 方法上,每当我开始新的意图时,我总是使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 在 loginScreen onBackPressed() 我打电话给finish() 但它不起作用。有谁知道为什么?以及我该如何解决这个问题。

谢谢你的帮助!!!

代码 sn-ps 在许多活动中:

@Override
    public void onBackPressed() {
        mpButtonClick.start();
        Intent intent = new Intent(this, MenuPagina.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(intent); 
        super.onBackPressed(); 
    }

在登录活动中:

@Override
    public void onBackPressed() {
        super.onBackPressed();
        getIntent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        LoginActivity.this.finish();
    }

【问题讨论】:

  • 用一些代码编辑了它
  • 这对我来说可能是完全错误和愚蠢的,但是 super.onBackPressed(); 有关系吗?在您清除意图/完成之前正在发生吗?
  • 没有,因为 javadoc 说“默认实现只是完成当前活动”

标签: android stack


【解决方案1】:
@Override
public void onBackPressed() {

   AlertDialog.Builder builder = new AlertDialog.Builder(this);
   builder.setTitle("Exit");
   builder.setMessage("Do you want to exit? ");
   builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

 // do something when the button is pressed
       public void onClick(DialogInterface arg0, int arg1) {

           finish();
       **YourActivityName**.super.finishAffinity();
    }
 })
 .setNegativeButton("No", new DialogInterface.OnClickListener() {

// do something when the button is pressed
        public void onClick(DialogInterface arg0, int arg1) {
         }
  }).show();


}

【讨论】:

  • YourActivityName.super.finishAffinity();例如,MyFirstActivity.super.finishAffinity();
【解决方案2】:

您可以通过两种方式做到这一点:

  1. 在后按时使用android.os.Process.killProcess(android.os.Process.myPid()); 杀死应用程序。

为此,您需要在清单上添加以下权限。

<uses-permission
        android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

2 。使用默认为 false 的静态布尔“isKill”变量,并且每次在登录活动 oncreate() 方法中设置为 false。

在登录活动 onBackPress() 方法中设置 isKill 值为 true。

然后在每个活动的 onResume() 方法中编写下面的代码

if(isKill)
{
    finish();
}

【讨论】:

  • 第一种方法比较粗暴,上手快。我已经尝试过了,但不幸的是它不起作用....我会尝试第二种方法,我会告诉你。
  • 我忘了提到第一种方法只有在堆栈上只有一个 Activity 时才会退出应用程序,所以第二种方法最适合你。我也在我的项目中使用第二个。
  • 我在一些活动中使用了您的第二种方法,它似乎有效。虽然我将 isKill 变量放在应用程序中,以便它成为全局变量并且所有活动都可以使用它。我会继续测试它,我会告诉你...
  • 我正在使用第二个,所以希望这对你有帮助。如果这对你有帮助,请接受答案。所以另一个用户利用了这一点。
【解决方案3】:

当启动一个我不想包含在我使用的 BackStack 中的活动时:

myintent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

我已经阅读(在此处某处)关于 onBackPressed() 没有调用,而是他们使用 onKeyPressed 并指定了后退按钮。我看看能不能找到例子。

这是一个例子: Android - onBackPressed() not working

【讨论】:

  • 但我确实希望在我的堆栈中有活动。我确实希望能够回到以前的活动。我只想在会话到期时清除堆栈并且我在 loginActivity 我应该按下并且应用程序应该关闭
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2017-10-05
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多