【问题标题】:How can I close my application on back pressed in android如何在android中关闭我的应用程序
【发布时间】:2012-01-10 06:44:01
【问题描述】:

当我按下设备的后退按钮时,我想进入主屏幕。我正在使用此代码..

public void onBackPressed() {
   this.finish();
   return;
}

【问题讨论】:

  • 这段代码遇到了什么问题?

标签: android


【解决方案1】:

按 BACK 键将有效地为您呼叫finish()。无需捕获 BACK 键。

我假设您的问题是,当您按下 BACK 键时,它只是回到您应用中的前一个 Activity

如果是这种情况,那么当所有活动在您的应用中启动新的Activity 时,让它们“自行终止”......

startActivity(new Intent(this, MyNewActivity.class));
finish();

如果您这样做,那么当您按 BACK 时将不会返回到 Activity,并且它将始终返回到主屏幕。

【讨论】:

  • 这应该是公认的答案。对我来说就像一个魅力
  • 这听起来很合理。
  • 它只会将另一个活动放在堆栈上。要返回,您必须在意图中设置一个标志。 FLAG_ACTIVITY_CLEAR_TOP
【解决方案2】:

你可以试试这个

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

【讨论】:

  • 我认为在这种情况下最好使用 FLAG_ACTIVITY_CLEAR_TOP
【解决方案3】:

你应该重写finish()

@Override
public void finish() {
    System.out.println("finish activity");      
    SaveData();     
    System.runFinalizersOnExit(true) ;          
    super.finish();
    android.os.Process.killProcess(android.os.Process.myPid());
}

然后像这样调用这个方法:

@Override
    public void onBackPressed() {
     this.finish();
    }

【讨论】:

  • 请不要向人们推荐这个。这确实不是 Android 应有的工作方式。
  • 为什么,请解释一下。当我只是不想让背部做除此之外的任何事情时,我喜欢这样。
【解决方案4】:

好的,要启动设备的主屏幕,请在 onKeyDown() 中使用此代码

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event)  { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
        // do something on back.
        Intent startMain = new Intent(Intent.ACTION_MAIN); 
        startMain.addCategory(Intent.CATEGORY_HOME); 
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(startMain); 

       this.finish(); 
        return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

如果您想关闭您的应用程序,那么我认为您必须通过finish() 以某种方式(某种标准方式)或使用来关闭您的所有活动

android.os.Process.killProcess(android.os.Process.myPid()) 这个代码会杀死你的应用程序。 (一些丑陋的方式..!)

【讨论】:

  • 这根本不是个好主意!看stackoverflow.com/questions/3473168/…的答案
  • 第一个不好:您正在启动主屏幕并要求它作为新任务启动。由于主屏幕始终在运行,系统将忽略您的标志。更重要的是,我们希望清理当前任务的活动堆栈,而不是跳转到主屏幕。第二种方法也很糟糕,你正在做操作系统应该做的事情。调用 finish() 就足够了,决定进程是否被杀死,是操作系统的工作。反正你自己也提到过。
  • @Vikram Bodicherla - 在这里我们不知道应用程序打开了多少活动。所以我不能只推荐finish(),另一种kill process的方法是,看看android Home键的实现代码,它也是这样做的......
【解决方案5】:

当您致电 NewAcitivy 时,请致电 finish()。在 startActivity 之后,之前的活动将被关闭。

然后使用

@Override
    public void onBackPressed() {
        super.onBackPressed();
        this.finish();
    }

【讨论】:

    【解决方案6】:

    你可以试试这个:

    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {       
      if(keyCode==KeyEvent.KEYCODE_BACK){
            this.finish ();
          }
        return true;
    }
    

    【讨论】:

    • 你这样做并没有取得任何成果。去掉这段代码会产生完全相同的效果!
    • 是的..!!!你是对的但是 onBackPressed 已被弃用......而且我经历过有时不会调用 onBackPressed 。所以放 onKeyDown 对我来说是更好的主意。但是,默认情况下,如果您按返回按钮,它将带您到上一个屏幕。
    • “但是,默认情况下,如果您按下返回按钮,它将带您进入上一个屏幕”:系统执行此操作的方式是在 Activity 上调用 finish()。这也是你正在做的事情。
    【解决方案7】:

    你想覆盖 OnkeyDown 并完成活动

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            // do something on back.
           this.finish();
            return true;
        }
    
        return super.onKeyDown(keyCode, event);
    }
    

    【讨论】:

      【解决方案8】:

      简单的方法是在您移动到下一个活动时完成当前活动。

      只需在 startActivity() 之后执行 finish(),然后在任何活动的后按时,您只需调用 finish() 即可退出应用程序,因为堆栈中不存在所有其他活动。

      【讨论】:

        【解决方案9】:

        你可以从任何地方关闭应用程序来调用这种类型的 Intent:

        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        

        这是在任何点击事件中从任何地方关闭应用程序的最佳方式

        【讨论】:

          【解决方案10】:

          您需要使用标志启动意图以清除实际活动之上的活动。

          public void onBackPressed() {
              Intent intent = new Intent(this, HomeActivity.class);
              intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
              this.startActivity(intent);
              this.finish();
          }
          

          【讨论】:

            【解决方案11】:

            引自官方Guideline

            FLAG_ACTIVITY_CLEAR_TOP

            如果设置,并且正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,除此之外的所有其他活动都将关闭,并且 此 Intent 将作为 新意图。

            FLAG_ACTIVITY_CLEAR_TASK

            如果在传递给 Context.startActivity() 的 Intent 中设置,此标志将 导致与活动相关联的任何现有任务 在活动开始之前被清除。也就是活动 成为一个空任务的新根,任何旧的 活动结束。这只能与 FLAG_ACTIVITY_NEW_TASK。

            FLAG_ACTIVITY_NO_HISTORY

            如果设置,新活动不会保存在历史堆栈中。立刻 用户离开它,活动就完成了。这可能 也可以使用 noHistory 属性设置。

            FLAG_ACTIVITY_NEW_TASK

            如果设置,此活动将成为此活动的新任务的开始 历史堆栈。

            @Override
            public void onBackPressed()
            {
            
                            Intent intCloseApp = new Intent(Intent.ACTION_MAIN);
                            intCloseApp.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            intCloseApp.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            intCloseApp.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                            intCloseApp.addCategory(Intent.CATEGORY_HOME);
                            intCloseApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intCloseApp);
              }
            

            【讨论】:

              【解决方案12】:
              public void onBackPressed() {
               System.exit(1);
                 return;
              }
              

              残酷的方式

              【讨论】:

                猜你喜欢
                • 2012-05-05
                • 2011-04-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多