【问题标题】:Exit Android application on back button在返回按钮上退出 Android 应用程序
【发布时间】:2012-11-10 18:04:26
【问题描述】:

我的应用程序标题中有带有后退箭头的 ImageButton。当用户按下它时,我在当前 Activity 上调用 finish()。我也可以选择让用户回家,但我想以某种方式清除活动历史记录,所以当用户按下主页活动的返回按钮时,应用程序会关闭。

我也可以在调用 home Activity 时为 Intent 设置一个参数,但我应该调用什么来关闭应用程序?

【问题讨论】:

  • 这在 android 上通常被认为是一种不好的做法。
  • 您正在实现一个非常非安卓的应用程序。你应该更多地遵循安卓指南。
  • 您可以在第一个活动的 onBackPressed() 方法中调用 finish()
  • 如果我们调用finish()函数,它将显示上一个活动页面,如果在您的应用程序主页中包含此功能,那么它将退出应用程序
  • 为什么安卓不寻常?当我点击返回时,完成()被调用:stackoverflow.com/questions/5308260/…。如果我用 Intent 调用 home Activity 并单击 home Activity,我希望应用程序退出,而不是返回上一个活动。

标签: android android-activity back-stack android-navigation


【解决方案1】:

当您进入一个活动时,将该活动上下文保存在某个位置(例如在某个上下文数组中)。

当你按下退出按钮时,你可以循环数组并说activity.finish()

所以堆栈中的所有活动现在都已完成,用户退出应用程序。

代码可能是这样的:

public class ActivityStack {

    public ArrayList<Context> contextArray=new ArrayList<>(); 

    public void setContext(int i,Context context) {
          contextArray.add(context);
    }

    public void quitApp() {
           for(context:ContextArray) {
              context.finish();  

            }
    }

}

编辑: 从 API 16 开始,finishAffinity() 方法可用于完成所有活动。

【讨论】:

    【解决方案2】:

    您需要使用 startIntentForResult() 调用活动。 然后在第二个活动中,您将执行以下操作:

    setResult(RESULT_OK);
    finish();
    

    在第一个活动中,获取此代码并关闭该活动:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (resultCode == RESULT_OK) {
      if (getParent() == null) {
      setResult(Activity.RESULT_OK, null);
      }
      else {
       getParent().setResult(Activity.RESULT_OK, null);
      }
      finish();
     }
    }
    

    【讨论】:

      【解决方案3】:

      Intent 标志 FLAG_ACTIVITY_CLEAR_TOP 将适合您的目的。

      在没有历史记录的情况下开始您的活动的示例:

      Intent intent = new Intent(this,ExampleActivity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
      

      【讨论】:

        【解决方案4】:

        当您关闭最后一个活动时,将应用视为已关闭。应用程序的生命周期超出了开发人员的职责范围,由框架处理。 当您的所有活动完成后,活动堆栈(历史记录)为空,因此下一次应用启动将启动您的第一个活动,首先调用 onCreate。

        但是,单例和其他静态字段将被保留,但 Android 会清除它们,因为它需要更多内存,所以这不是问题。

        我还建议您参考this thread 了解更多详情。

        【讨论】:

          【解决方案5】:

          做这样的事情..

          手动关闭你的服务

          @Override
          public void onBackPressed() {
              Intent intent = new Intent(NewFox_Project.this,RadioService.class);
              moveTaskToBack(true);
              stopService(intent);
          
          
              Intent radioTimes = new Intent(NewFox_Project.this,RadioTimeService.class);
              moveTaskToBack(true);
              stopService(radioTimes);
          
              Intent radioPlyerService = new Intent(NewFox_Project.this,RadioPlayerService.class);
              moveTaskToBack(true);
              stopService(radioPlyerService);
          
              NewFox_Project.this.finish();
              super.onBackPressed();
          }
          
          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) {
          
              if(event.getKeyCode()==KeyEvent.KEYCODE_BACK)
              {
                  Intent intent = new Intent(NewFox_Project.this,RadioService.class);
                  moveTaskToBack(true);
                  stopService(intent);
          
          
                  Intent radioTimes = new Intent(NewFox_Project.this,RadioTimeService.class);
                  moveTaskToBack(true);
                  stopService(radioTimes);
          
                  Intent radioPlyerService = new Intent(NewFox_Project.this,RadioPlayerService.class);
                  moveTaskToBack(true);
                  stopService(radioPlyerService);
          
                  NewFox_Project.this.finish();
              }
              return super.onKeyDown(keyCode, event);
          }
          

          【讨论】:

            【解决方案6】:

            你可以使用这个功能:

            //to remove application from task manager
            public void onQuitPressed() {
            
                int pid = android.os.Process.myPid();
                android.os.Process.killProcess(pid);
            }
            

            【讨论】:

            • 我已经尝试过了,但是当我调用它时,所有活动都保留在堆栈上。我只是丢失了我的应用程序的所有数据,但活动仍然存在。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-21
            • 2014-06-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多