Как выйти из приложения и показать главный экран?


У меня есть приложение, где на главной странице у меня есть кнопки для навигации через приложение.

на этой странице у меня есть кнопка "Выход", которая при нажатии должна вывести пользователя на главный экран на телефоне, где находится значок приложения.

Как я могу это сделать?

18 183

18 ответов:

дизайн Android не способствует выходу из приложения по выбору, а скорее управляет им ОС. Вы можете вызвать домашнее приложение по его соответствующему намерению:

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

может быть, вы можете попробовать что-то вроде этого

предположим, что в нашем приложении у нас есть ряд действий(скажем, десять), и нам нужно выйти непосредственно из этой деятельности. Что мы можем сделать, это создать намерение и перейти к корневой активности и установить флаг в намерении как

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

кроме того, добавьте некоторые дополнительные, как boolean к намерению

intent.putExtra("EXIT", true);

затем в корневой активности, проверьте значение boolean и в соответствии с этим вызовом finish (), в onCreate() корня активность

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

Это, вероятно, то, что вы ищете. Он закроет все приложение и перенесет вас на главный экран.

это хорошо работает для меня.
Закройте все предыдущие действия следующим образом:

    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
    }

сначала завершите свое приложение с помощью метода finish();

а затем добавить ниже строки в onDestroy для удаления силы закрыть

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

Если вы хотите завершить действие, вы можете просто позвонить finish(). Однако это плохая практика, чтобы иметь кнопку выхода на экране.

Не рекомендуется выходить из вашего приложения для Android. Смотрите это вопрос для более подробной информации.

пользователь всегда может выйти из приложения через кнопку home или в первом действии через кнопку Назад.

некоторые действия на самом деле вы не хотите, чтобы открыть снова, когда кнопка Назад нажата такая активность экрана заставки, активность экрана приветствия, окна подтверждения. На самом деле вам это не нужно в стеке действий. вы можете сделать это с помощью=> открыть манифест.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);

}

или

в нажатой кнопке назад вы хотите выйти из этого действия, а также вы также не хотите добавлять это в стек действий. вызовите метод finish() внутри метода onBackPressed (). это не сделает закрыть все приложение. он пойдет на предыдущий активность в стеке.

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

(Я пробовал предыдущие ответы, но они не хватает в некоторые моменты. Например, если вы не делаете return; после завершения действия выполняется оставшийся код действия. Также вам нужно отредактировать onCreate с возвратом. Если вы не работаете супер.метод onCreate (), вы получите ошибку времени выполнения)

скажи, что у тебя есть MainActivity и ChildActivity.

внутри ChildActivity добавить это:

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

внутри onCreate MainActivity добавьте это:

@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

когда U вызовет finish onDestroy () этого действия будет вызван, и он вернется к предыдущему действию в стеке действий... Так.. для выхода не вызывайте finish ();

вот что я сделал:

некоторая активность.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, это завершит задачу.

добавить следующие строки после finish(); in onDestroy():

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

я попробовал приложения, используя следующий фрагмент кода, это сработало для меня. Надеюсь, это поможет вам. я сделал небольшую демонстрацию с 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;
        }
    }
}

Я сделал это с режимом наблюдателя.

интерфейс наблюдателя

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

Дочерний субъект реализует метод exit

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

Если вы хотите выйти из приложения поместите этот код под свою функцию

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 (метод)

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

        }
    });

Если вы хотите выйти из приложения. Затем используйте этот код внутри события нажатия кнопки. как:

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