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

Android 如何退出应用程序并显示主屏幕?,android,exit,back-button,Android,Exit,Back Button,我有一个应用程序,在主页上我有一些按钮,用于导航应用程序 在该页面上,我有一个按钮“退出”,单击该按钮时,用户将进入手机的主屏幕,应用程序图标位于该屏幕上 我该怎么做?不建议退出您的Android应用程序。有关更多详细信息,请参见此 用户总是可以通过home按钮退出应用程序,或者在第一个活动中通过back按钮退出应用程序。Android的设计不支持通过选择退出应用程序,而是通过操作系统进行管理。您可以根据其相应的意图启动Home应用程序: Intent intent = new Intent(I

我有一个应用程序,在主页上我有一些按钮,用于导航应用程序

在该页面上,我有一个按钮“退出”,单击该按钮时,用户将进入手机的主屏幕,应用程序图标位于该屏幕上


我该怎么做?

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


用户总是可以通过home按钮退出应用程序,或者在第一个活动中通过back按钮退出应用程序。

Android的设计不支持通过选择退出应用程序,而是通过操作系统进行管理。您可以根据其相应的意图启动Home应用程序:

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

如果要结束活动,只需调用
finish()

但是,在屏幕上有一个退出按钮是不好的做法。

当您调用该活动的finish onDestroy()时,它将被调用,并将返回到活动堆栈中的上一个活动。。。所以对于退出,不要调用finish()

也许你可以试试这样的东西

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
另外,在意图中添加一些额外的like boolean

intent.putExtra("EXIT", true);
然后在根活动中,检查根活动的
onCreate()
中的
boolean
值,并根据该调用finish()

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}
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;
        }
    }
}

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

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

然后在onDestroy中添加以下行以移除强制关闭

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

finish()之后添加以下行在onDestroy()中


我尝试使用下面的代码片段退出应用程序,这对我来说很有效。希望这对你有帮助。 我做了两个活动的小演示

第一项活动

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}
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;
        }
    }
}

这对我很有效。
按如下方式结束之前的所有活动:

    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
    }

我是用观察者模式做的

观察者界面

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);
    }
}
}
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'
}
}
(我尝试了前面的答案,但在某些方面有所欠缺。例如,如果在完成活动后不执行
返回;
,则会运行剩余的活动代码。此外,还需要使用返回编辑onCreate。如果不运行super.onCreate(),则会出现运行时错误)

假设您有
MainActivity
ChildActivity

在活动中添加以下内容:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;
@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}
在MainActivity的onCreate中添加以下内容:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;
@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

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

当按下后退按钮时,有些活动实际上不想再次打开,如启动屏幕活动、欢迎屏幕活动、确认窗口。实际上,在活动堆栈中不需要这个。您可以使用=>打开manifest.xml文件并添加属性来完成此操作

android:noHistory=“true”

对这些活动的支持

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

按下“后退”按钮,您希望退出该活动,但也不希望将其添加到活动堆栈中。在onBackPressed()方法中调用finish()方法。它不会关闭整个应用程序。它将用于堆栈中的上一个活动

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

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

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

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}

还有一个选项,使用finishafinity方法关闭堆栈中与应用程序相关的所有任务

见: 以下是我所做的:

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();
    }
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}
QuitAppActivity.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();
    }
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

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

如果您想退出应用程序 将此代码置于您的功能下

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

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


您只需将
moveTaskToBack(true)
添加到退出按钮的
onClickedListener
中,即可最小化应用程序

希望能有所帮助。

也许我的代码可以帮助我使用hepls(Main\u Activity.java):


你甚至可以使用。。“moveTaskToBack(true);”它会释放所有资源吗?因为当我以这种方式退出应用程序时,一段时间后,我再次单击应用程序图标。从我留下的地方开始。这意味着应用程序仍在后台运行。这会将你的应用程序保留在后台,因此不会退出应用程序。此回答只会显示主屏幕,不会按照OP的要求完全退出/关闭应用程序。这将对你有帮助:moveTaskToBack(true);android.os.Process.killProcess(android.os.Process.myPid());系统出口(1);应该是小写的出口吗?应该是System.exit(0)。但它并不是很有用。System.exit(0)不应该按照核心Android团队的建议使用。我认为这是在特殊情况下的最佳方法。比如说,对于一个需要互联网的应用程序,连接会将一些活动打断到该应用程序中。可以显示警报对话框(不带按钮)。后退按钮需要退出整个应用程序,因为重新进入需要再次登录/初始化。我发现只有System.exit能正常工作。但不确定@user1699548注释。这是否也会杀死与该应用程序相关的所有服务?只需在onCreate中不执行任何操作即可调用finish。在我的情况下,我还必须覆盖
onNewIntent
。因为intnet.getExtras()一直为null。此方法将重新启动
RootActivity
,而不是从堆栈中恢复它。选中此处以克服此问题不要使用此选项,因为它没有机会释放资源-1因为每当您离开活动时都会执行onDestroy,n