【问题标题】:I want to end the whole application when user click back button in android当用户单击android中的后退按钮时,我想结束整个应用程序
【发布时间】:2013-01-16 01:11:04
【问题描述】:

当用户单击 android 中的后退按钮时,我想结束整个应用程序。当前它再次转到上一个打开的活动。 我也尝试覆盖 onBackPressed() 但它不起作用。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        onBackPressed();
    }
       return super.onKeyDown(keyCode, event);
}
enter code here
@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    return;
}

【问题讨论】:

  • 当你说你覆盖了它......你确实意识到你的实现什么都不做?就像您刚刚调用了父实现一样……这又回到了上一个活动。如果你想结束申请

标签: android


【解决方案1】:

试试这个,从一个作为你的 Root 的 Activity 启动你的应用程序。

public class Root extends Activity {

     public void onCreate() {
         super.onCreate();
         handleIntent();
      }

      public void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent();
      }

     private void handleIntent() {
         boolean end = getIntent.getBooleanExtra("End");
         if (end) {
            finish();
         } else {
            Intent intent = new Intent(this, MyRealFirstActivity.class); // where this is the class that you want the user to see when they launch your app.
            startActivity(intent);
         }
      }



      public void onResume() {
        super.onResume();
        finish();
      }
}

然后在您希望后退按钮结束应用的 Activity 中,执行以下操作:

public class LastActivity extends Activity {

    public void onBackPressed() {
        Intent intent = new Intent(this, Root.class);
        intent.putExtra("End", true);
        intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }
}

这样,在您启动应用程序然后点击后退按钮之间开始的所有活动都将为您完成()。这基本上会从头到尾清理应用程序的状态,然后退出。

【讨论】:

  • 这种是有道理的,但是我认为当活动回到前台时总是调用 onResume 。想象一下,当您接到电话时,您正处于根活动中。当调用结束时,您的根活动将被带回前台,调用 onResume - 并且活动结束。不是很好,是吗?
  • 但是在同样的逻辑下,onResume 已经被调用了......所以活动已经完成了。恢复不会发生,它会在之后立即开始的活动处发生。
【解决方案2】:

在这种情况下,您需要完成活动,因此您当前的活动将使用 finish() 方法关闭。但是您还应该在之前的每个活动中都编写完成(),您可以在其中调用意图(开始另一个活动)。希望它说清楚。

【讨论】:

    【解决方案3】:
     public void onBackPressed() {
    
             Intent intent = new Intent(Intent.ACTION_MAIN);
             intent.addCategory(Intent.CATEGORY_HOME);
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             this.finish();
             startActivity(intent);
           }
    

    【讨论】:

      【解决方案4】:

      这里我们有两种方法finish or kill应用程序按下后退按钮

      1. 使用finish() 关闭或完成 android 屏幕上的当前活动。

        例如:您有 2 个活动,即 AB。您将使用意图从 A 活动转到 B 活动,现在前台活动为 B,您想返回并杀死 B 活动和转到 A 活动使用finish() 后退按钮单击。如果您在 A 活动,则它会关闭应用程序。见下面的代码。

        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
        finish();
        }
        return super.onKeyDown(keyCode, event);
        }
        
      2. 使用android.os.Process.killProcess(android.os.Process.myPid()); 杀死应用程序,即强制关闭应用程序并转到主屏幕。请参阅下面的代码。

        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
        // Kills & force closes the app 
        android.os.Process.killProcess(android.os.Process.myPid());
        }
        return super.onKeyDown(keyCode, event);
        }
        

      【讨论】:

        【解决方案5】:

        这是我在应用中的做法:ActivityA 是第一个启动的;它依次启动 ActivityB。在 ActivityB 中我可能会遇到错误,在这种情况下我想返回到 ActivityA,或者一切都可能正确完成,在这种情况下我想完全“完成”应用程序。

        在活动A中:

        public class ActivityA extends Activity {
        ...
            private final static int REQUEST_ACT_B = 1;
        ...
            private void startChild() {
                startActivityForResult(new Intent(this, ActivityB.class), REQUEST_ACT_B;
            }
        
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                if(requestCode == REQUEST_TASK && resultCode == ActivityB.RESULT_OK) {
                    this.finish();
                }
            }
        }
        

        然后在ActivityB中:

        public class ActivityB extends Activity {
        ...
            public final static int RESULT_OK = 1;
            public final static int RESULT_ERROR = 2;
        ...
            private void finishWithError() {
                setResult(RESULT_ERROR);
                finish();
            }
        
            private void finishSuccessfully() {
                setResult(RESULT_OK);
            }
        }
        

        基本上,ActivityA 启动 ActivityB 并期望返回结果。如果它收到返回的结果“OK”,那么它会自行关闭,而用户也不明智:应用程序已经完成。如果收到结果“错误”,则 ActivityA 保持打开状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 2016-11-29
          • 1970-01-01
          • 2019-12-17
          • 1970-01-01
          相关资源
          最近更新 更多