【问题标题】:How to exit the android application on backpress?如何在后台退出 android 应用程序?
【发布时间】:2018-10-19 02:45:26
【问题描述】:

情况可能就像说,我有 5 个活动。说主要活动、活动 1、活动 2、活动 3 和活动 4。

可以借助插入到 Main Activity 布局中的按钮直接使用 Activity 1、2、3 和 4。

情况:用户进入Main Activity,按一下按钮进入Activity 2。然后他回按又回到Main Activity。从那里,他现在借助另一个按钮进入活动 3,同样,当他按下返回按钮时,他进入主活动。

主活动 --> 活动 2 --> 主活动 --> 活动 3 --> 主活动。

问题:现在当用户从活动 3 进入主活动时。用户在 Main Activity 布局上。现在,如果用户按下手机上的返回按钮,那么将通过以下过程退出应用程序:

主活动 --> 活动 3 --> 主活动 --> 活动 2 --> 主活动 --> 退出

需要完成:我想从 Main Activity 本身退出应用程序,如果用户按下手机上的后退按钮,那么不是按照上述路径退出应用程序,我希望用户应该能够通过显示一个简单的 AlertDialog 框将其从 Main Activity 本身退出

由于我无法找到解决此问题的方法,该怎么做?

【问题讨论】:

标签: android android-layout android-studio android-sdk-tools android-event


【解决方案1】:

添加您的 MainActivity

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

【讨论】:

    【解决方案2】:

    您需要在 MainActivity() 中覆盖 onBackPressed() 并使用 finishAffinity 完成所有活动

    onBackPressed()

    当 Activity 检测到用户按下返回键时调用。

    finishAffinity() : added in API level 16

    在当前任务中完成此活动以及紧接其下方的所有具有相同亲和力的活动。

    示例代码

    @Override
    public void onBackPressed() {
      super.onBackPressed();
      ActivityCompat.finishAffinity(MainActivity.this);
    }
    

    编辑

    我希望用户应该能够通过显示一个简单的 AlertDialog 框从主 Activity 本身退出它。

    @Override
    public void onBackPressed() {
    
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Alert")
                    .setCancelable(false)
                    .setMessage("Are your sure want to exit?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.finishAffinity(MainActivity.this);
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
    
                        }
                    });
    
            builder.show();
    
    }
    

    【讨论】:

    • 快速说明:finishAffinity() 仅适用于 API 级别 16 以上
    • @V-rundPuro-hit 是的,你是对的,谢谢我更新了我的答案
    • 是的,但这是删除所有活动的更好方法。而且我认为现在低于 API 16 的目标设备已经很少了。但肯定这个答案有帮助。谢谢。 @NileshRathod
    【解决方案3】:

    编写双击退出主活动是一个很好的代码实践。

    boolean doubleBackToExitPressedOnce = false;
    
    @Override
    public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }
    
    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
    
    new Handler().postDelayed(new Runnable() {
    
        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;                       
        }
    }, 2000);
    

    }

    【讨论】:

      【解决方案4】:

      这是退出应用程序的常用方法,我也建议在 MainActivity 以外的活动清单中使用“nohistory”属性。

      boolean doubleBackToExitPressedOnce = false;
      @Override
      public void onBackPressed() {
          if (doubleBackToExitPressedOnce) {
              super.onBackPressed();
              return;
          }
      
      this.doubleBackToExitPressedOnce = true;
      Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
      
      new Handler().postDelayed(new Runnable() {
      
          @Override
          public void run() {
              doubleBackToExitPressedOnce=false;                       
          }
      }, 2000);
      

      }

      对于其他活动,在清单中使用 nohistory 方法

           <activity
              android:name="com.omniapay.salesservice.Activities.LoginActivity"
              android:label="LOGIN"
              android:noHistory="true" />
      

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        相关资源
        最近更新 更多