【问题标题】:Android close app on back buttonAndroid 在后退按钮上关闭应用程序
【发布时间】:2013-10-01 06:35:28
【问题描述】:

应用程序看起来像这样: MainActivity -> UserActivity -> DetailsActivity。 (活动的大致顺序)。

我想在 DetailsActivity(行中的第三个活动)中单击后退按钮时关闭应用程序。

想知道这样做是否是一种好习惯以及最好的方法是什么?

【问题讨论】:

标签: android


【解决方案1】:

如果我理解正确,即使堆栈不为空,您也想关闭活动,这意味着堆栈中有超过 1 个活动?

好吧,如果只有一个……就:

finish();

否则诀窍是:

Intent intent = new Intent(Main.this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

onCreate 的同一活动中:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}

所以你清除堆栈然后杀死剩下的一个......你可以在任何活动中执行此操作,当然在onBackPressed 中使用它:)

【讨论】:

  • finish() 只会结束当前活动!
  • 术士请阅读整个答案... :) 这个解决方案有效...我知道完成()结束当前活动,但由于您清除了堆栈,您只有 1 个单一活动...您的当前...
  • 您无需手动操作!因为 android 提供了一个直接调用来将你的活动移动到堆栈的最底部 moveTaskToBack(true);
  • 术士,这里的问题是在后按时退出程序...如果您重新排列堆栈,它仍然不是空的...所以一旦您使用后按按钮,活动顶部的活动堆栈将被调用...它仍然不会退出...您需要做的是清除堆栈。否则你只会返回到不同的活动
  • @Jony-Y 清除堆栈也会影响其他打开的应用程序吗?
【解决方案2】:

您可以通过覆盖后退按钮事件来实现 在特定条件下不添加特定活动的历史记录。

@Override
public void onBackPressed()
{
    if ( ! getIntent().getExtras().getBoolean(FROM_SETTINGS_KEY))
        moveTaskToBack(true); // exist app
    else
        finish();
}

在我的示例中,它检查我启动活动的位置的标志,如果从设置启动则正常运行,否则将其置于顶部并在按下后退出应用程序

【讨论】:

  • moveTaskToBack(true); 实际上非常简洁,因为从技术上讲,它不会关闭应用程序而是跳出它。
  • 什么是FROM_SETTINGS_KEY
  • 我定义的自定义常量
  • 不错。这是我正在寻找的行为。这样,用户可以在登录活动时按下回退时关闭应用程序而不会杀死它。因此,如果用户重新访问该应用程序,他/她不需要重新启动该应用程序。
  • 我不明白! getIntent().getExtras().getBoolean(FROM_SETTINGS_KEY)你在检查什么?
【解决方案3】:

试试这个。

 quitBtn.setOnClickListener(new View.OnClickListener() {         
    @Override
    public void onClick(View paramView) 
  {
        finish();          
        moveTaskToBack(true);
    }
});

【讨论】:

    【解决方案4】:

    试试这个,在你的 mainifest 文件中添加noHistory 每个活动。

    android:noHistory="true"
    

    【讨论】:

    • 如果我把它放在清单中,那么在活动中我只需调用finish()?
    • 它什么也没做。我将 noHistory 放入我的活动清单中,并按下后退按钮称为完成,但我刚刚回到上一个活动
    • @John 无需调用完成。只要把这个放在历史上就够了
    • @MuraliGanesan UserActivity 中的操作是什么,想要导航到以前的活动?检查此使用操作栏developer.android.com/design/patterns/navigation.html
    • @John github.com/ihrupin/samples/tree/master/android/… 这里有示例项目,只需下载使用即可。你会得到解决方案
    【解决方案5】:

    当您从 MainActivity 启动 UserActivity 时,将 finish() 放在 startActivity() 之后。 启动 DetailsActivity 时在 UserActivity 中执行相同操作

    【讨论】:

    • 优秀!!!像魅力一样工作并且在您想要关闭应用程序时让我们不必清除堆栈,因为您不再打算使用的每个活动都可以在您导航到工作流程中的下一个活动后立即关闭! :)
    【解决方案6】:

    在您当前的活动中:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK ) {
            Intent intent = new Intent(CurrentActivity.this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("EXIT", true);
            startActivity(intent);
        }
        return super.onKeyDown(keyCode, event);
    }
    

    在 MainActivity OnCreate 内:

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    

    【讨论】:

    【解决方案7】:

    这对我有用:

    public void onBackPressed(){
    Intent a = new Intent(Intent.ACTION_MAIN);
    a.addCategory(Intent.CATEGORY_HOME);
    a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(a);
    }
    

    【讨论】:

      【解决方案8】:

      1) 在项目中创建一个名为 Constants.java 的文件

      2) 将此代码添加到该文件中

          public static void killAll() {
      
          for (Activity act : Constants.activity_stack) {
              act.finish();
          }
          Constants.activity_stack.clear();
      
      }
      

      3)现在当你在 onCreate() 中的 Main Activity 中添加下面的 sn-p

              // add to stack
          Constants.activity_stack.add(this);
      

      4)类似地将用户活动添加到堆栈中

      5)在 onBackPressed() 的 Delivery Details 中使用下面的 sn-p

      Constants.killAll();//will kill all the activities and bring you out of the application.
      

      【讨论】:

      • 最好让android处理activity的生命周期,如果你完成了一些activity android就知道怎么处理它了
      【解决方案9】:

      这是一个完整的类,展示了当第一个活动中的按钮被按下时如何调用另一个活动。

      public class FirstActivity extends Activity implements View.OnClickListener {
      
          Button goToSecondActivityButton;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              setContentView(R.layout.first_activity);
      
              ((TextView) findViewById(R.id.textRecommendationMessage)).setText("This is the first activity");
      
              goToSecondActivityButton= (Button) findViewById(R.id.button_go_to_second_activity);
              goToSecondActivityButton.setOnClickListener(this);
          }
      
           @Override
           public void onClick(View view) {
      
               goToSecondActivity();
          }
      
          private void goToSecondActivity() {
      
              Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
              startActivity(intent);
              finish();
          }
      }
      

      【讨论】:

      • 正确但偏离主题,因为 OP 要求如何适当地“关闭”应用程序
      【解决方案10】:

      如果您从 MainActivity 调用 UserActivity,则在 startActivity() 之后调用 finish()。下面是代码:

      Intent userActivity = new Intent(MainActivity.this, UserActivity.class);
             userActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
             MainActivity.this.startActivity(userActivity );
             finish();
      

      【讨论】:

        【解决方案11】:

        关于你的活动

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            onBackPressed();
            return super.onOptionsItemSelected(item);
        }
        
        public void onBackPressed(){
            Intent a = new Intent(Qeydiyyat.this,Login.class);
            a.addCategory(Intent.CATEGORY_HOME);
            a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(a);
        

        【讨论】:

          【解决方案12】:
             public void onBackPressed() {
              moveTaskToBack(true);
          
          }
          

          【讨论】:

            【解决方案13】:

            可能有更多方法可以实现这一点,但这里有 2 种方法对我有用。一种方法是将任务移回堆栈。

                override fun onBackPressed() {
                    moveTaskToBack(true);
                }
            

            另一种方法是:

                override fun onBackPressed() {
                    val activityToMove = Intent(Intent.ACTION_MAIN)
                    activityToMove.addCategory(Intent.CATEGORY_HOME) //Indicate the next activity
                    activityToMove.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    startActivity(activityToMove)
                }
            

            【讨论】:

              【解决方案14】:

              在DetailedActivity中使用onBackPressed()方法

                override fun onBackPressed(){ //trigger when user press back button
                    super.onBackPressed()
                    finishAffinity()  //This will close all acitivities
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-09-16
                • 1970-01-01
                • 2012-09-23
                • 1970-01-01
                相关资源
                最近更新 更多