在后退按钮上退出Android应用程序

时间:2012-11-22 10:46:21

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

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

我还可以在调用home活​​动时为intent设置一个参数,但是我要求应用程序关闭什么?

6 个答案:

答案 0 :(得分:1)

当你去参加一个活动时,将那个activityContext保存在某个地方(例如在某些上下文数组中)。

当您按退出按钮时,您可以循环播放数组并说出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()方法可用于完成所有活动。

答案 1 :(得分:1)

您需要使用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();
 }
}

答案 2 :(得分:1)

意图标志FLAG_ACTIVITY_CLEAR_TOP符合您的目的。

启动没有历史记录的活动的示例:

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

答案 3 :(得分:0)

您可以使用此功能:

//to remove application from task manager
public void onQuitPressed() {

    int pid = android.os.Process.myPid();
    android.os.Process.killProcess(pid);
}

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

做这样的事情..

手动关闭您的服务

@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);
}