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


93

Я впевнений, що це запитання задавали кілька разів, тому що я прочитав кілька. Мій клієнт хоче, щоб я вклав у його додаток кнопку, де користувачі можуть натискати та виходити. Я прочитав це і виявив, що дзвінок finish()це зробить. Але фініш лише закриває поточну активну діяльність, чи не так? У мене багато дій, тому в цьому випадку я повинен пройти кожен екземпляр діяльності та закінчити їх або зробити кожну діяльність за шаблоном Singleton.

Я також дізнався, як Activity.moveTaskToBack(true)можна потрапити на головний екран. Добре, це не закриття, а фоновий процес. То чи це ефективно?

Який метод слід використовувати, щоб повністю закрити програму? Будь-який із описаних вище чи будь-який інший спосіб / інше використання вищезазначених методів?


чому б не використовувати панель дій. натисніть на піктограму програми, перейдіть на головний екран. натисніть кнопку назад, щоб вийти
Рагхундан

@Raghunandan: Як я вже згадував, вимога клієнта :(
Lemon Juice

Перевірте, чи допомагає це android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley


Відповіді:


71

Насправді кожен шукає закриття програми на події onclick, де б не було активності ....

Отже, хлопці, друзі, спробуйте цей код. Помістіть цей код на подію onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
Це насправді не "повністю закриває програму", як запитував PeakGen, оскільки програма все ще працює, але це гарна альтернатива
La masse

2
Я не думаю, що , якщо діяльність розпочалася з НОВОЮ ЗАВДАННЯМ
ЗАПАСНОСТІ

51

Ви можете зателефонувати System.exit (); щоб вийти з усієї кислотності.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });

5
Це просто підводить мене до першого заняття
Lemon Juice

8
@AnchitMittal System.exit (1) не гарантує скидання стеку активності або завдань (див. Developer.android.com/guide/components/… ). Таким чином, такий підхід не гарантує належного вимкнення програми (знищення всіх Діянь) у встановлений час.
ІгорГанапольський

Не всі дії для виходу.
Jitendra

49

Метод finishAffinity, випущений в API 16, закриває всі поточні дії та додаток:

this.finishAffinity();

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

Зверніть увагу, що ця обробка не дозволяє вам доставити результати до попередньої діяльності, і якщо ви намагаєтесь це зробити, буде видано виняток.


Починаючи з API 21, ви можете використовувати:

finishAndRemoveTask();

Завершує всі дії з цим завданням і вилучає зі списку останніх завдань.

Альтернативи:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

Джерело: Як програмно вийти з програми Android


Сподіваюся, це допоможе! Щасти!


2
Не використовуйте System.exit (). Android спробує перезапустити програму після її виходу. Ви могли б опинитися в петлі.
AndroidDev

42

Якщо ви хочете вийти із своєї програми, використовуйте цей код всередині натиснутої кнопки:

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

24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

4
Що відрізняється між n System.exit (1); та System.exit (0);
Pyae Phyo

System.exit (1) означає, що програма закінчила роботу з деякою помилкою, тоді як System.exit (0) означає, що програма закінчилася без помилок. Це те, як різні команди linux / unix повертають умови (помилки) при виході.
iOS-Coder


13

Точно є дві можливі ситуації:

  1. Можливо, ви захочете вийти з цього заходу
  2. Або ви хочете вийти з програми

Ви можете вийти з активності, використовуючи такий код:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Але це не призведе до знищення основних видів діяльності в одному додатку. Це просто мінімізує додаток.

Якщо ви хочете вийти з програми, використовуйте наступний код, щоб завершити процес:

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

для моно розробки просто використовуйте

process.KillProcess(Process.MyPid());

Mypid () - це ваш метод чи що ...... так як ви пишете Mypid ... вам доводиться писати методом .....
Amitsharma

@amitsharma MyPid () - це метод із класу Process, який повертає ідентифікатор цього процесу, який можна використовувати з killProcess (int) і sendSignal (int, int)
Касун

Це зупинить фонову службу та приймачі трансляції, або просто безпечно закриє програму?
Усман Рана

отже, яка різниця між android.os.Process.killProcess(android.os.Process.myPid()); і process.KillProcess(Process.MyPid());?
DysaniazzZ

7

Як на рахунок this.finishAffinity()

З документів,

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


6
android.os.Process.killProcess(android.os.Process.myPid());

Для мого випадку це врятувало мені життя. Дякую!
Ліфка

4

це очистить Завдання (набір заходів) і розпочне нове Завдання

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);

Поясніть, чому ви опублікували цей код як відповідь і що він також робить.
M. Adeel Khalid

1
Ласкаво просимо до Stack Overflow! Незважаючи на те, що ви, можливо, вирішили проблему цього користувача, відповіді лише на код не надто корисні для користувачів, які в майбутньому прийдуть до цього питання. Будь ласка, відредагуйте свою відповідь, щоб пояснити, чому ваш код вирішує початкову проблему.
Joe C

3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }

2

помістіть цей у свій onClic:

moveTaskToBack(true);
    finish()

що не так із проголосованим. Це відповідь. Я отримав 2 дії, 1-й - це логічність, а 2-й - основна діяльність .... я хотів вийти з програми в межах основної активності і не хочу повертатися до логінної активності ... я вставляю цю відповідь, і тепер я можу закрити програму в межах головної діяльності.
Азізі Муса

якщо ви зробите це, програма все одно працюватиме у фоновому режимі
Моханад Хаддадін,

Працює нормально. Мій випадок: splashActivity запускає MainActivity. Коли користувач знову натискає MainActivity, програма виходить, як очікувалося. Усі інші випадки повернули мене до сплеску!
Jviaches

Ну, вам слід було закінчити вхід, як тільки вхід закінчиться :) І відповідь, звичайно, не зовсім правильна , movewTaskToBackнічого не закінчує, вона просто приховує додаток, і, finishяк згадано будь-ким, закінчує лише поточний activity. Тож він припиняє поточну діяльність і приховує решту, якщо така є. У будь-якому випадку, він не повинен отримувати голос
Meow Cat 2012,

2

Спробуйте це під час дзвінка. Іноді я використовую його при натисканні кнопки.

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

Замість того, щоб закрити вашу програму, вона відкриває інформаційну панель, так що виглядає так, ніби ваша програма закрита.

прочитайте це питання для більшої чіткості android - вихід із коду програми


2

Використовуйте this.finishAffinity (); на цій кнопці замість finish (); Якщо це не працює, ви також можете спробувати, додавши android: noHistory = "true" у свій маніфест, а потім закінчити свою діяльність uisng finish (); або finishAffinity ();

Сподіваюся, це допоможе .... :)


2

Досягнення в Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

Це посилання на System.Environment.Exit або Android.OS.Environment.Exit?
Моффен

2

Просто викликайте ці дві функції

 finish();
 moveTaskToBack(true);

Ваша відповідь надійшла в публікаціях нижчої якості. Будь ласка, надайте деякі пояснення, хоча ваш код є зрозумілим.
Харша Біяні,

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Використовуйте цей Кодекс, який є дуже корисним, і Ви можете вийти з усіх видів діяльності.


Я зробив це, а потім кинув телефон з 5-го поверху, всі заходи закрились, окрім того
Пасхаліс

1

привидна активність, що викликається з використанням singletop і finish () на onCreate, має зробити трюк



1

Замість System.exit (1) Просто використовуйте System.exit (0)


1

Якщо хтось все-таки задається питанням, для Xamarin.Android (у моєму випадку також Monogame, на якому працює) команда FinishAndRemoveTask()on Activityробить свою роботу дуже добре!



0

просто використовуйте код у зворотному стилі

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

0

Якщо ви використовуєте EventBus (або насправді будь-яку іншу бібліотеку pub / sub) для спілкування між діями, ви можете надіслати їм явну подію:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

Єдиним недоліком цього є те, що вам потрібно всі дії, щоб прослухати цю подію, щоб назвати їх власними finish(). Для цього ви можете легко створити класи діяльності shim за допомогою успадкування, які просто слухають цю подію і дозволяють підкласам реалізовувати все інше, а потім переконайтеся, що всі ваші дії успадковуються від цього додаткового рівня. Слухачі вбивства можуть навіть додати додаткову функціональність за допомогою перевизначень, таких як уникнення смерті в певних конкретних ситуаціях.


0

Просто запустіть два рядки нижче, коли ви хочете вийти з програми

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

0
finish();
 finishAffinity();
 System.exit(0);

працював у мене


1
Будь ласка, додайте пояснення до свого коду. Крім того, схоже, інші відповіді це вже охоплюють - тому вам слід також пояснити, що робить ваше рішення кращим за інші
Ніко Хаасе

0

Просто зателефонуйте:

finishAffinity();

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Ігор Ф.

0

Пов’яжіть цей метод із кнопкою виходу / виходу

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

Якщо ви використовуєте як завершення, так і вихід, програма закриється повністю

закінчити ();

System.exit (0);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.