如何退出应用程序并显示主屏幕?


195

我有一个应用程序,在主页上有用于浏览该应用程序的按钮。

在该页面上,我有一个“退出”按钮,单击该按钮应将用户带到应用程序图标所在手机的主屏幕。

我怎样才能做到这一点?

Answers:


326

Android的设计不支持选择退出应用程序,而是通过OS对其进行管理。您可以通过相应的Intent调出Home应用程序:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

25
您甚至可以使用..“ moveTaskToBack(true);”
hemanth kumar 2012年

17
它会释放所有资源吗?因为当我以这种方式退出应用程序并过一段时间后,我再次单击该应用程序图标。它从我离开的地方开始。这意味着该应用程序仍在后台运行。
Adil Malik

12
Activity.finish();
hB0

11
这样会使您的应用程序处于后台,因此不会退出该应用程序。
Herman Schoenfeld 2013年

3
这个答案只会使主屏幕出现,并且不会按照OP的要求完全退出/关闭应用程序。
2014年

74

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

假设在我们的应用程序中,我们有许多活动(例如十个活动),我们需要直接退出此活动。我们可以做的是,创建一个意图并转到根活动,然后将意图中的标志设置为

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

另外,向意图添加一些额外的内容,例如布尔值

intent.putExtra("EXIT", true);

然后在根活动,检查的值boolean,并根据该呼叫结束(),在onCreate()根活动

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

1
只需在onCreate中什么都不做即可调用finish。
盗版者

2
就我而言,我也必须重写onNewIntent。因为intnet.getExtras()保持为空。
zznq 2013年

而且此方法将重新启动您,RootActivity而不是从堆栈中恢复它。检查此处以克服此stackoverflow.com/a/26258455/609782
达潘(Darpan)2014年

28
System.exit(0);

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


1
那应该是小写的出口吗?
卡罗尔2012年

1
应该是System.exit(0)。但这不是很有用。
superarts.org 2012年

7
Android.core团队不建议使用System.exit(0)。
Dinesh Venkata 2012年

2
我认为这是在特殊情况下的最佳方法。假设某个应用需要互联网,并且连接中断了该应用的一些活动。可以显示一个警报对话框(无按钮)。由于重新输入要求再次登录/初始化,因此后退按钮需要退出整个应用程序。System.exit是我发现的唯一可以正常工作的东西。虽然不确定@ user1699548的评论。
赫尔曼·舍恩菲尔德

1
这也会杀死与该应用程序相关的所有服务吗?
bsara 2013年

25

这对我来说很好。
关闭所有先前的活动,如下所示:

    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

    setContentView(R.layout.main_layout);

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

这对我不起作用。它使我的应用程序看不到任何东西,但是仍然可以运行。我可以看到线程在调试器中徘徊并等待,它们实际上将不会做任何事情。
斯蒂芬M-罢工

23

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

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

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

3
永远不要使用它,因为它没有机会释放资源
Jacky 2013年

1
-1是因为onDestroy会在您离开活动时执行,不仅是在按下返回键时会执行。
Hamzeh Soboh

5
@Jacky:杀死进程如何不释放任何系统资源?
2013年

1
为什么是super.onDestroy()killProcess()?会达到这条线吗?
shoosh '16

难道这还杀死了您所有的服务吗?
Irshu

20

如果您想结束某项活动,只需致电即可finish()。但是,在屏幕上显示退出按钮是一种不好的做法。


2
我将其用于“您需要将此应用更新到最新版本”,但我不希望他们继续使用它。还是不好的做法...?
beetree

@beetree是的。像任何不良做法一样,在某些情况下,它是您唯一的选择,并且您会使用它,因为尝试执行其他操作将是毫无意义的。与非法语法相反,这是一种不好的做法,它的用途是在少数情况下可用,但是您应该尽最大的努力找到一种更好的方法。在您的情况下,没有一个。
基金莫妮卡的诉讼

17

有些活动实际上是您不想在按返回按钮时再次打开的,例如闪屏活动,欢迎屏幕活动,确认窗口。实际上,您无需在活动堆栈中使用它。您可以使用=>打开manifest.xml文件并添加属性来执行此操作

android:noHistory =“ true”

这些活动。

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

要么

有时您想通过按某些后退按钮来关闭整个应用程序。此处的最佳做法是打开主窗口,而不是退出应用程序。为此,您需要重写onBackPressed()方法。通常,此方法打开堆栈中的顶级活动。

@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()方法。它不会关闭整个应用程序。它将用于堆栈中的上一个活动。

@Override
public void onBackPressed() {
  finish();
}

16

不建议退出您的Android应用程序。有关更多详细信息,请参见此问题

用户始终可以通过“主页”按钮或在第一个活动中通过“后退”按钮退出您的应用程序。


3
@janusz:按下主屏幕按钮永远不会退出android应用程序,而是会在后台...
Jayesh 2013年

5

(我尝试过以前的答案,但它们有些不足。例如,如果您未return;完成活动后,则剩余的活动代码将运行。另外,您需要使用return编辑onCreate。如果您未运行super.onCreate()您将收到运行时错误)

说你有MainActivityChildActivity

在ChildActivity内添加以下内容:

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内添加以下内容:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

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


3

当您调用完成时,将调用该活动的onDestroy()并将其返回到活动堆栈中的上一个活动。


3

这是我所做的:

SomeActivity.java

 @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

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

基本上,您从堆栈中清除了所有活动并启动了工作QuitAppActivity,这将完成任务。


好方法。无需通过Intent传递值。
user3144836 '18

0

添加以下行后finish();onDestroy()

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

0

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

第一次活动

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

您的其他任何活动

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

0

我用观察者模式做到了。

观察者界面

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

基础科目

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

子主题实现退出方法

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

您的应用程序应该对其进行扩展的MyApplication

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

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

}

基本活动

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

}

让我们测试一下

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

如果要退出应用程序,请将此代码放在您的函数下

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

0

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

    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();

        }
    });

0

您可以添加moveTaskToBack(true)退出按钮onClickedListener以最小化应用程序。

希望能帮助到你。


0

也许我的代码可以帮助(Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

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

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.