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


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.