我创建了一个应用程序,并且从不对每个活动使用finish()。如果我的用户点击了注销按钮,它将转到上一页。
如何关闭之前的活动并关闭应用程序?
答案 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)
修改强>
当用户按下注销时:
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();
中
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()
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,用于保存您创建的每个活动。 当你退出时,你只需要完成列表中的所有活动。