关闭Android应用程序中的所有运行活动?

时间:2011-12-23 11:19:57

标签: android android-activity

我创建了一个应用程序,并且从不对每个活动使用finish()。如果我的用户点击了注销按钮,它将转到上一页。

如何关闭之前的活动并关闭应用程序?

11 个答案:

答案 0 :(得分:6)

这是我尝试过的一种解决方法,它对我来说非常有用。

SOLUTION-1

this.finish();//try activityname.finish instead of this
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

在您要退出应用程序的活动中使用它....

=============================================== =================================== 上面的代码有助于恢复您上次离开时​​的应用。

<强> SOLUTION-2

如果您想退出应用程序并关闭所有需要使用的正在运行的活动。

onActivityResult()

例如 - 假设您有3个活动A,B,C从A-> B-> C导航,而在C,您要关闭所有活动,然后使用以下示例。

活动A

public class A extends Activity {
int Finish = 100;
Button launch_second;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    launch_second = (Button) findViewById(R.id.start_second_act);
    launch_second.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent second = new Intent(A.this,
                    B.class);
            startActivityForResult(second, Finish);
        }
    });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 100:
        this.finish();
        break;
    default:
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);

}

活动B

public class B extends Activity {
private Button launch_next;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_main);
    launch_next = (Button) findViewById(R.id.start_third_activity);
    launch_next.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent third = new Intent(B.this,C.class);
            startActivityForResult(third, 100);
        }
    });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 100:
        setResult(requestCode);
        this.finish();
        break;

    default:
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

}

活动C

public class C extends Activity {
Button kill_app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.third_main);
    kill_app = (Button)findViewById(R.id.kill_app_btn);
    kill_app.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            C.this.finish();
            setResult(100);

        }
    });

}

}

<强> SOLUTION-3

有可用的方法finishAffinity()从任何活动中调用它,之前的所有活动都将被销毁。

答案 1 :(得分:3)

修改

Sam Janz的回答比这种方法更清晰。尽可能使用intent flags

当用户按下注销时:

Intent intent = new Intent(this,MyHomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putBooleanExtra("finishApplication", true);
startActivity(intent);

然后在MyHomeActivity(您的开始活动)in onResume

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

通过这种方式,您无需在所有活动中检查只有Home活动。


Dirtier选项:

在某个地方创建一个静态布尔变量(可能在扩展应用程序的类中);

public static boolean loggingOut = false;

当用户按下注销时,将此设置为true并在该活动上调用finish。

YourApplication.loggingOut = true;
finish();

在每个activity in onResume()

if(loggingOut){
   finish();
}

确保在main / start up活动中将此布尔值设置为false:

if(loggingOut){
   finish();
   YourApplication.loggingOut = false;
}

如果您还想要后退按钮override onBackPressed(),那么它也会执行

@Override
public void onBackPressed(){
     YourApplication.loggingOut = true;
     super.onBackPressed();
}

答案 2 :(得分:1)

为每项活动使用finish()

1)Activity lifecycle

2)Shutting down Activity and managing Activities lifecycle

3)同样的问题answered in detail(2种方法 - 广播接收者(+1)和Intent.FLAG_ACTIVITY_CLEAR_TOP)

答案 3 :(得分:1)

感谢您的回复。我解决了我的问题。

解决方案:我编写了一个包含一些数据的文件,当用户点击注销时,我删除了该文件中的数据和finish()当前活动,以及之前的所有活动我在onResume()编写代码我读了文件,如果它为空或finish(),那么它将关闭您的所有活动,您的应用程序将关闭。谢谢你的帮助。

答案 4 :(得分:1)

Intent intent = new Intent(this, LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

说明

public static Intent makeRestartActivityTask (ComponentName mainActivity)

创建一个可用于在其基本状态下重新启动应用程序任务的Intent。这类似于makeMainActivity(ComponentName),但也设置标志FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK。

答案 5 :(得分:0)

@Override
    public void onClick(View v) {

        if (v == btnAtGlanceBack) {
            Intent backIntent = new Intent(this, Dashboard.class);
            startActivity(backIntent);

        } else if (v == btnAtGlanceLogOut) {
            Intent logoutIntent = new Intent(this, GlobalScholarLogin.class);
            logoutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(logoutIntent);

        }
    }

答案 6 :(得分:0)

一般来说,Android主堆栈适用于您启动的所有活动,并根据您调用下一个活动的方式将其删除。 如果要清除所有活动,请在启动活动时设置此标记Intent.FLAG_ACTIVITY_CLEAR_TASK,以便清除之前的活动。

答案 7 :(得分:0)

要清除跟踪Android活动的整个堆栈,您可以使用以下代码

Intent intent = new Intent(this, MyHomeActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        finish();
        startActivity(intent);

答案 8 :(得分:0)

将这行代码放在您的应用程序中 System.exit(2);

答案 9 :(得分:0)

你可以使用这个 Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

从这个问题的答案 How to exit from the application and show the home screen?

答案 10 :(得分:0)

您可以在应用程序中添加一个List,用于保存您创建的每个活动。 当你退出时,你只需要完成列表中的所有活动。