Як вийти з програми та показати головний екран?


196

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

На цій сторінці у мене є кнопка "EXIT", яка при натисканні повинна перенести користувача на головний екран телефону, де знаходиться значок програми.

Як я можу це зробити?

Відповіді:


327

Дизайн Android не сприяє виходу з програми за вибором, а керує ним ОС. Ви можете підняти домашню програму відповідною її наміром:

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

17
чи буде вона розподіляти всі ресурси? Тому що, коли я виходжу з програми таким чином і через деякий час знову натискаю на піктограму програми. Це починається з того місця, де я його залишив. Це означає, що додаток все ще працював у фоновому режимі.
— Аділ Малик

12
Activity.finish ();
— hB0

11
Це зберігає ваш додаток у фоновому режимі, тому він не виходить із програми.
— Герман Шенфельд

3
Ця відповідь просто зробить головний екран і не вийде / закриє програму повністю так, як хоче ОП.
— Basher51

74

Можливо, ви можете спробувати щось подібне

Припустимо, у нашій програмі у нас є ряд заходів (скажімо, десять), і нам потрібно вийти безпосередньо з цієї діяльності. Що ми можемо зробити, це створити намір і перейти до кореневої діяльності та встановити прапор у намірі як

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

також додайте до наміру кілька додаткових, таких як булева

intent.putExtra("EXIT", true);

Потім у кореневій активності перевірте значення booleanта відповідно до цього виклику закінчення (), у onCreate()кореневій активності

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

1
Просто не робіть нічого в onCreate, щоб викликати обробку.
— imcaptor

2
У моєму випадку мені довелося також перемогти onNewIntent. Через те, що intnet.getExtras () залишається нульовим.
— zznq

І цей метод перезапустить ваш, RootActivityзамість того, щоб відновити його з стека. Перевірте тут , щоб подолати цю stackoverflow.com/a/26258455/609782
— дарпана

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 для видалення сили закрити

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

3
ніколи не використовуйте це, тому що у нього немає шансів на безкоштовні ресурси
— Джекі

1
-1 тому, що onDestroy виконується щоразу, коли ви виходите з діяльності, а не лише при натисканні клавіші "назад".
— Hamzeh Soboh

5
@Jacky: а як процес вбивства не звільняє жодних системних ресурсів?
— Герман Шоенфельд

1
Чому super.onDestroy()після killProcess()? чи вдалося б досягти цієї лінії?
— shoosh

Чи це також не вбиває всі ваші служби?
— Іршу

20

Якщо ви хочете припинити діяльність, ви можете просто зателефонувати finish(). Однак погана практика мати кнопку виходу на екран.


2
Я використовую його для "Вам потрібно оновити цей додаток до останньої версії", і я не хочу, щоб вони продовжували його використовувати. Ще погана практика ...?
— буряк

@beetree Так. Як і будь-яка погана практика, є випадки, коли це ваш єдиний варіант, і ви використовуєте його, тому що намагатися зробити щось інше було б безглуздим. Сенс у тому, що це погана практика , на відміну від незаконного синтаксису , полягає в тому, що він доступний для тих кількох випадків, але ви повинні спробувати свій наймиліший, щоб знайти кращий спосіб зробити це. У вашому випадку такого немає.
— Фонд позову Моніки

17

Деякі дії насправді ви не хочете відкривати знову, коли натискаєте кнопку "назад" таку активність Splash Screen, активність екрана привітання, підтвердження Windows. Насправді вам це не потрібно в степі активності. ви можете зробити це, використовуючи => відкрити файл manifest.xml та додати атрибут

android: noHistory = "вірно"

до цих заходів.

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

АБО

Іноді потрібно закрити всю програму певним натисканням кнопки "назад". Тут найкраща практика - це відкрити домашнє вікно замість виходу із програми. Для цього вам потрібно перекрити метод onBackPress (). зазвичай цей метод відкриває верхню активність у стеку.

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

}

АБО

Натиснутою кнопкою "назад" ви хочете вийти з цієї активності, а також ви також не хочете додавати це в стек діяльності. метод завершення виклику () методом onBackPress (). це не дозволить закрити всю програму. він буде переходити до попередньої активності в стеку.

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

16

Не рекомендується виходити з програми Android. Дивіться це питання для більш детальної інформації.

Користувач завжди може вийти з вашого додатка за допомогою кнопки додому або в першій діяльності через кнопку "назад".


3
@janusz: натискання кнопки додому ніколи не закривайте Android-програму, замість цього вона переходить у фоновому режимі ...
— Jayesh

5

(Я спробував попередні відповіді, але їх не вистачає в деяких моментах. Наприклад, якщо ви цього не зробите return; після завершення діяльності, залишається код активності. Також вам потрібно відредагувати onCreate з return. Якщо ви не запускаєте 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;

Додайте це:

@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, що закінчить завдання.


Хороший підхід. Не потрібно передавати значення за допомогою намірів.
— користувач3144836

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

Subject Subject реалізує метод виходу

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

Можливо, мій код може 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.