关于android:如何退出应用程序并显示主屏幕?

How to exit from the application and show the home screen?

我有一个应用程序,在主页上我有通过应用程序导航的按钮。

在那个页面上,我有一个"EXIT"按钮,当点击它时,应该将用户带到应用程序图标所在的手机上的主屏幕。

我怎样才能做到这一点?


Android的设计不赞成通过选择退出应用程序,而是通过操作系统管理它。您可以通过相应的Intent调出Home应用程序:

1
2
3
4
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


也许你可以尝试这样的事情

假设在我们的应用程序中,我们有许多活动(比如十个),我们需要直接退出此活动。我们可以做的是,创建一个intent并转到root活动并在intent中设置标志

1
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

另外,在意图中添加一些额外的布尔值

1
intent.putExtra("EXIT", true);

然后在root活动中,检查boolean的值,并根据调用finish(),在根活动的onCreate()

1
2
3
if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}


1
System.exit(0);

可能就是你要找的东西。它将关闭整个应用程序并带您进入主屏幕。


这对我很有用。
关闭所有以前的活动,如下所示:

1
2
3
4
5
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

然后在MainActivity onCreate()方法中添加此项以完成MainActivity

1
2
3
4
5
6
    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }


首先使用方法finish();完成您的应用程序

然后在onDestroy中添加以下行以删除Force关闭

1
2
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();


如果要结束活动,只需调用finish()即可。
然而,在屏幕上有一个退出按钮是不好的做法。


有些活动实际上你不想在按下后退按钮时再次打开这样的Splash Screen Activity,欢迎屏幕活动,确认Windows。实际上你在活动堆栈中不需要这个。你可以使用=> open manifest.xml文件并添加一个属性

android:noHistory="true"

这些活动。

1
2
3
4
5
<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label=""
    android:noHistory="true">
</activity>

要么

有时您希望在某些后退按钮中关闭整个应用程序。这里的最佳实践是打开主窗口而不是退出应用程序。为此,您需要覆盖onBackPressed()方法。通常这种方法会打开堆栈中的顶级活动。

1
2
3
4
5
6
7
8
@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

要么

在按下后退按钮时,您希望退出该活动,并且您也不想在活动堆栈中添加此活动。在onBackPressed()方法中调用finish()方法。它不会关闭整个应用程序。它将用于堆栈中的先前活动。

1
2
3
4
@Override
public void onBackPressed() {
  finish();
}

建议不要退出Android应用程序。有关详细信息,请参阅此问题。

用户可以随时通过主页按钮退出应用程序,也可以通过后退按钮退出第一个活动。


(我尝试过以前的答案,但他们缺少一些观点。例如,如果你在完成活动后没有做return;,剩下的活动代码就会运行。你还需要编辑onCreate with return。如果你没有运行super。 onCreate()你会得到一个运行时错误)

假设你有MainActivityChildActivity

在ChildActivity里面添加:

1
2
3
4
5
Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

在MainActivity的onCreate里面添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}

还有另一种选择,使用FinishAffinity方法关闭与应用程序相关的堆栈中的所有任务。

看到:
https://stackoverflow.com/a/27765687/1984636


这是我做的:

SomeActivity.java

1
2
3
4
5
6
7
 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

1
2
3
4
5
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

基本上你所做的是清除堆栈中的所有活动并启动QuitAppActivity,这将完成任务。


当你调用完成后,该活动的onDestroy()将被调用,它将返回活动堆栈中的前一个活动...所以..退出时不要调用finish();


我尝试使用以下代码片段退出应用程序,这对我有用。希望这对你有所帮助。
我做了2个活动的小型演示

第一次活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

你的任何其他活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

100%工作正常。 这是退出你的应用程序的代码onClick(方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(),"Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

我用观察者模式做到了。

观察者界面

1
2
3
public interface Observer {
public void update(Subject subject);
}

基础科目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

子主题实现退出方法

1
2
3
4
5
public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

您的应用程序应该扩展它的MyApplication

1
2
3
4
5
6
7
8
public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

基础活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

我们来试试吧

1
2
3
4
5
6
7
8
public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

如果你想退出申请
将此代码放在您的函数下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void yourFunction()
{
finishAffinity();  
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}


onDestroy()中的finish();之后添加以下行:

1
2
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

如果要退出应用程序。然后在按下按钮的事件中使用此代码。
喜欢:

1
2
3
4
5
6
public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}