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


196

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

На этой странице у меня есть кнопка «ВЫХОД», которая при нажатии приводит пользователя на домашний экран телефона, на котором находится значок приложения.

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

Ответы:


327

Дизайн Android не способствует выходу из приложения по выбору, а скорее управляет им в ОС. Вы можете вызвать приложение 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);"
Хемант Кумар

17
будет ли он уничтожать все ресурсы? Потому что, когда я выхожу из приложения таким образом и через некоторое время я снова нажимаю значок приложения. Это начинается с того места, где я его оставил. Это означает, что приложение все еще работало в фоновом режиме.
Адил Малик,

12
Activity.finish ();
hB0

11
Это держит ваше приложение в фоновом режиме, поэтому оно не выходит из приложения.
Герман Шенфельд

3
Этот ответ просто отобразит домашний экран и не закроет / не закроет приложение полностью, как того хочет ОП.
Basher51

74

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

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Кроме того, добавить некоторые дополнительные, как логическое значение к намерению

intent.putExtra("EXIT", true);

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

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

1
Просто ничего не делайте в onCreate, чтобы вызвать финиш.
imcaptor

2
В моем случае мне пришлось также переопределить onNewIntent. Потому что intnet.getExtras () продолжал быть нулевым.
zznq

И этот метод перезапустит ваш RootActivityвместо того, чтобы возобновить его из стека. Проверьте здесь, чтобы преодолеть этот stackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

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


1
Должен ли это быть выход из нижнего регистра?
Кэрол

1
должен быть System.exit (0). Но это все равно не очень полезно.
superarts.org

7
System.exit (0) не должен использоваться в соответствии с рекомендациями основной команды Android.
Динеш Венката

2
Я думаю, что это лучший подход для исключительных обстоятельств. Скажем, для приложения, которому нужен интернет, и соединение разрывает несколько действий в приложении. Диалоговое окно предупреждения может быть отображено (без кнопок). Кнопка «Назад» должна выйти из всего приложения, поскольку для повторного входа требуется повторный вход в систему / инициализация. System.exit - единственное, что работает разумно, я нашел. Не уверен насчет комментария @ user1699548.
Герман Шенфельд

1
Будет ли это убивать все службы, связанные с этим приложением?
Бсара

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
    }

Это не работает для меня. Это оставляет мое приложение с ничего не видно, но все еще работает как. Я вижу потоки, зависающие и ожидающие в отладчике, который на самом деле никогда ничего не сделает.
Стивен М-на забастовке -

23

сначала закончите ваше приложение, используя метод finish();

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

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

3
никогда не используйте это, потому что у него нет шансов освободить ресурсы
Джеки

1
-1, потому что onDestroy выполняется всякий раз, когда вы покидаете действие, а не только при нажатии клавиши «назад».
Hamzeh Soboh

5
@Jacky: а как убить процесс не освобождает системные ресурсы?
Герман Шенфельд

1
Почему super.onDestroy()после killProcess()? будет ли достигнута эта линия?
Shoosh

разве это также не убивает все ваши услуги?
Irshu

20

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


2
Я использую его для «Вам нужно обновить это приложение до последней версии», и я не хочу, чтобы они продолжали его использовать. Все еще плохая практика ...?
свекла

@beetree Да. Как и любая плохая практика, есть случаи, когда это ваш единственный вариант, и вы используете его, потому что пытаться сделать что-то еще было бы бессмысленным. Точка причем плохая практика , в отличии от незаконного синтаксиса , является то , что он доступен для тех немногих случаев, но вы должны попробовать darndest , чтобы найти лучший способ сделать это. В вашем случае его нет.
Фонд Моника иск

17

Некоторые действия на самом деле вы не хотите открывать снова, когда нажата кнопка «Назад», такие как «Заставка», «Экран приветствия», «Подтверждение Windows». На самом деле вам не нужно это в стеке активности. Вы можете сделать это, используя => открыть файл manifest.xml и добавить атрибут

андроид: noHistory = "истина"

к этой деятельности.

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

16

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

Пользователь всегда может выйти из приложения с помощью кнопки «Домой» или в первом действии с помощью кнопки «Назад».


3
@janusz: нажатие кнопки «Домой» никогда не завершает работу приложения Android, вместо этого оно идет в фоновом режиме ...
Джаеш

5

(Я пробовал предыдущие ответы, но им не хватает некоторых моментов. Например, если вы не выполните return;после завершения действия, выполняется оставшийся код действия. Также вам нужно отредактировать onCreate с возвратом. Если вы не запускаете super.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
}


3

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


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

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% работает нормально. это код для выхода из приложения на клик (метод)

    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

Может быть, мой код может hepls (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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.