Как закрыть приложение для Android?

Я хочу закрыть свое приложение, чтобы оно больше не работало в фоновом режиме.

Как это сделать? Это хорошая практика на платформе Android?

Если я полагаюсь на кнопку "назад", она закрывает приложение, но оно остается в фоновом режиме. Существует даже приложение под названием "TaskKiller", чтобы убить эти приложения в фоновом режиме.

Ответ 1

Просто, чтобы ответить на мой собственный вопрос сейчас, после такого большого количества времени (поскольку CommonsWare прокомментировал самый популярный ответ, говорящий, что мы НЕ должны этого делать):

Когда я хочу выйти из приложения:

  • Я запускаю свое первое действие (либо заставку, либо любую другую активность в нижней части стека активности) с помощью FLAG_ACTIVITY_CLEAR_TOP (который прекратит все другие действия, запущенные после него, а это значит - все они). Просто сделайте это действие в стеке действий (не завершите его по какой-либо причине заранее).
  • Я вызываю finish() для этого действия

Вот оно, хорошо работает для меня.

Ответ 2

У Android есть механизм, позволяющий безопасно закрыть приложение в своей документации. В последнем действии, которое вышло (обычно это основное действие, которое впервые появилось при запуске приложения), просто поместите пару строк в метод onDestroy(). Вызов System.runFinalizersOnExit(true) гарантирует, что все объекты будут завершены, а мусор будет собран, когда приложение завершит работу. Вы также можете быстро убить приложение с помощью android.os.Process.killProcess(android.os.Process.myPid()), если хотите. Лучший способ сделать это - поместить в класс помощника следующий метод, а затем вызвать его всякий раз, когда приложение нужно убить. Например, в способе уничтожения корневой активности (при условии, что приложение никогда не убивает это действие):

Также Android не будет уведомлять приложение о ключевом событии HOME, поэтому вы не можете закрыть приложение, когда нажата клавиша HOME. Android резервирует ключевое событие HOME для себя, чтобы разработчик не мог помешать пользователям покинуть приложение. Однако вы можете определить, нажав клавишу HOME, установив флаг в true в классе-помощнике, который предполагает, что нажата клавиша HOME, а затем измените флаг на false когда происходит событие, которое показывает, что клавиша HOME не нажата, а затем проверьте, чтобы кнопка HOME была нажата в методе onStop() активность.

Не забывайте обращаться с клавишей HOME для любых меню и действий, которые запускаются в меню. То же самое относится к клавише ПОИСК. Ниже приведены примеры примеров для иллюстрации:

Вот пример корневой активности, которая убивает приложение при его уничтожении:

package android.example;

/**
 * @author Danny Remington - MacroSolve
 */

public class HomeKey extends CustomActivity {

    public void onDestroy() {
        super.onDestroy();

        /*
         * Kill application when the root activity is killed.
         */
        UIHelper.killApp(true);
    }

}

Здесь абстрактная активность, которая может быть расширена для обработки HOME для всех видов деятельности, которые ее расширят:

package android.example;

/**
 * @author Danny Remington - MacroSolve
 */

import android.app.Activity;
import android.view.Menu;
import android.view.MenuInflater;

/**
 * Activity that includes custom behavior shared across the application. For
 * example, bringing up a menu with the settings icon when the menu button is
 * pressed by the user and then starting the settings activity when the user
 * clicks on the settings icon.
 */
public abstract class CustomActivity extends Activity {
    public void onStart() {
        super.onStart();

        /*
         * Check if the app was just launched. If the app was just launched then
         * assume that the HOME key will be pressed next unless a navigation
         * event by the user or the app occurs. Otherwise the user or the app
         * navigated to this activity so the HOME key was not pressed.
         */

        UIHelper.checkJustLaunced();
    }

    public void finish() {
        /*
         * This can only invoked by the user or the app finishing the activity
         * by navigating from the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
        super.finish();
    }

    public void onStop() {
        super.onStop();

        /*
         * Check if the HOME key was pressed. If the HOME key was pressed then
         * the app will be killed. Otherwise the user or the app is navigating
         * away from this activity so assume that the HOME key will be pressed
         * next unless a navigation event by the user or the app occurs.
         */
        UIHelper.checkHomeKeyPressed(true);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.settings_menu, menu);

        /*
         * Assume that the HOME key will be pressed next unless a navigation
         * event by the user or the app occurs.
         */
        UIHelper.homeKeyPressed = true;

        return true;
    }

    public boolean onSearchRequested() {
        /*
         * Disable the SEARCH key.
         */
        return false;
    }
}

Вот пример экрана меню, который обрабатывает ключ HOME:

/**
 * @author Danny Remington - MacroSolve
 */

package android.example;

import android.os.Bundle;
import android.preference.PreferenceActivity;

/**
 * PreferenceActivity for the settings screen.
 * 
 * @see PreferenceActivity
 * 
 */
public class SettingsScreen extends PreferenceActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.settings_screen);
    }

    public void onStart() {
        super.onStart();

        /*
         * This can only invoked by the user or the app starting the activity by
         * navigating to the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
    }

    public void finish() {
        /*
         * This can only invoked by the user or the app finishing the activity
         * by navigating from the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
        super.finish();
    }

    public void onStop() {
        super.onStop();

        /*
         * Check if the HOME key was pressed. If the HOME key was pressed then
         * the app will be killed either safely or quickly. Otherwise the user
         * or the app is navigating away from the activity so assume that the
         * HOME key will be pressed next unless a navigation event by the user
         * or the app occurs.
         */
        UIHelper.checkHomeKeyPressed(true);
    }

    public boolean onSearchRequested() {
        /*
         * Disable the SEARCH key.
         */
        return false;
    }

}

Вот пример вспомогательного класса, который обрабатывает ключ HOME в приложении:

package android.example;

/**
 * @author Danny Remington - MacroSolve
 *
 */

/**
 * Helper class to help handling of UI.
 */
public class UIHelper {
    public static boolean homeKeyPressed;
    private static boolean justLaunched = true;

    /**
     * Check if the app was just launched. If the app was just launched then
     * assume that the HOME key will be pressed next unless a navigation event
     * by the user or the app occurs. Otherwise the user or the app navigated to
     * the activity so the HOME key was not pressed.
     */
    public static void checkJustLaunced() {
        if (justLaunched) {
            homeKeyPressed = true;
            justLaunched = false;
        } else {
            homeKeyPressed = false;
        }
    }

    /**
     * Check if the HOME key was pressed. If the HOME key was pressed then the
     * app will be killed either safely or quickly. Otherwise the user or the
     * app is navigating away from the activity so assume that the HOME key will
     * be pressed next unless a navigation event by the user or the app occurs.
     * 
     * @param killSafely
     *            Primitive boolean which indicates whether the app should be
     *            killed safely or quickly when the HOME key is pressed.
     * 
     * @see {@link UIHelper.killApp}
     */
    public static void checkHomeKeyPressed(boolean killSafely) {
        if (homeKeyPressed) {
            killApp(true);
        } else {
            homeKeyPressed = true;
        }
    }

    /**
     * Kill the app either safely or quickly. The app is killed safely by
     * killing the virtual machine that the app runs in after finalizing all
     * {@link Object}s created by the app. The app is killed quickly by abruptly
     * killing the process that the virtual machine that runs the app runs in
     * without finalizing all {@link Object}s created by the app. Whether the
     * app is killed safely or quickly the app will be completely created as a
     * new app in a new virtual machine running in a new process if the user
     * starts the app again.
     * 
     * <P>
     * <B>NOTE:</B> The app will not be killed until all of its threads have
     * closed if it is killed safely.
     * </P>
     * 
     * <P>
     * <B>NOTE:</B> All threads running under the process will be abruptly
     * killed when the app is killed quickly. This can lead to various issues
     * related to threading. For example, if one of those threads was making
     * multiple related changes to the database, then it may have committed some
     * of those changes but not all of those changes when it was abruptly
     * killed.
     * </P>
     * 
     * @param killSafely
     *            Primitive boolean which indicates whether the app should be
     *            killed safely or quickly. If true then the app will be killed
     *            safely. Otherwise it will be killed quickly.
     */
    public static void killApp(boolean killSafely) {
        if (killSafely) {
            /*
             * Notify the system to finalize and collect all objects of the app
             * on exit so that the virtual machine running the app can be killed
             * by the system without causing issues. NOTE: If this is set to
             * true then the virtual machine will not be killed until all of its
             * threads have closed.
             */
            System.runFinalizersOnExit(true);

            /*
             * Force the system to close the app down completely instead of
             * retaining it in the background. The virtual machine that runs the
             * app will be killed. The app will be completely created as a new
             * app in a new virtual machine running in a new process if the user
             * starts the app again.
             */
            System.exit(0);
        } else {
            /*
             * Alternatively the process that runs the virtual machine could be
             * abruptly killed. This is the quickest way to remove the app from
             * the device but it could cause problems since resources will not
             * be finalized first. For example, all threads running under the
             * process will be abruptly killed when the process is abruptly
             * killed. If one of those threads was making multiple related
             * changes to the database, then it may have committed some of those
             * changes but not all of those changes when it was abruptly killed.
             */
            android.os.Process.killProcess(android.os.Process.myPid());
        }

    }
}

Ответ 3

ДА! Вы можете, безусловно, закрыть приложение, чтобы оно больше не работало в фоновом режиме. Как и другие, прокомментировал finish() рекомендованный Google способ, который на самом деле не означает, что ваша программа закрыта.

System.exit(0);

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

Я лично ненавижу, когда выбираю Exit в приложении, и он действительно не выходит.

Ответ 4

Так я это сделал:

Я просто положил

Intent intent = new Intent(Main.this, SOMECLASSNAME.class);
Main.this.startActivityForResult(intent, 0);

внутри метода, который открывает действие, а затем внутри метода SOMECLASSNAME, который предназначен для закрытия приложения, которое я положил:

setResult(0);
finish();

И я поместил следующее в мой класс Main:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == 0) {
        finish();
    }
}

Ответ 5

Невозможно использовать API-интерфейсы. Он по усмотрению операционной системы (Android) должен решить, когда процесс должен быть удален или остаться в памяти. Это по соображениям эффективности: если пользователь решает перезапустить приложение, то он уже там, без необходимости его загрузки в память.

Нет, он не только обескураживает , это невозможно.

Ответ 6

Просто напишите этот код на вашей кнопке EXIT нажмите.

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("LOGOUT", true);
startActivity(intent);

И в методе onCreate() вашего MainActivity.class напишите ниже код как первую строку,

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

Ответ 7

Для выхода из способов приложения:

Способ 1:

вызвать finish(); и переопределить onDestroy();. Поместите следующий код в onDestroy():

System.runFinalizersOnExit(true)

или

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

Способ 2:

public void quit() {
    int pid = android.os.Process.myPid();
    android.os.Process.killProcess(pid);
    System.exit(0);
}

Способ 3:

Quit();

protected void Quit() {
    super.finish();
}

Способ 4:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

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

Способ 5:

Иногда вызов finish() приведет только к выходу из текущей активности, а не по всему приложению. Однако для этого есть обходной путь. Каждый раз, когда вы запускаете activity, запустите его, используя startActivityForResult(). Когда вы хотите закрыть все приложение, вы можете сделать что-то вроде следующего:

setResult(RESULT_CLOSE_ALL);
finish();

Затем определите обратный вызов для каждого действия onActivityResult(...), поэтому, когда activity возвращается с значением RESULT_CLOSE_ALL, он также вызывает finish():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode){
        case RESULT_CLOSE_ALL:{
            setResult(RESULT_CLOSE_ALL);
            finish();
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Ответ 8

Вот как работает Windows Mobile... хорошо... когда-либо! Вот что Microsoft должна сказать по этому поводу:

http://blogs.msdn.com/windowsmobile/archive/2006/10/05/The-Emperor-Has-No-Close.aspx (грустно ли, что я помнил название блога полностью с 2006 года? Я нашел статью о Google, ища "у императора нет близких" lol)

Короче:

Если системе требуется больше памяти, а приложение находится в фоновом режиме, itll закройте приложение. Но если система не нужно больше памяти, приложение будет оставаться в ОЗУ и быть готовым вернуться быстро в следующий раз, когда пользователю потребуется он.

Многие комментарии в этот вопрос в O'Reilly предполагают, что Android ведет себя одинаково, закрывая приложения, которые не были использованы на некоторое время, только когда Android нуждается в памяти, которую они используют.

Так как это стандартная функция, то изменение поведения для принудительного закрытия приведет к изменению пользовательского интерфейса. Многие пользователи будут привыкнуть к мягкому увольнению своих приложений для Android, поэтому, когда они увольняют одного из них с намерением вернуться к нему после выполнения некоторых других задач, они могут быть весьма расстроены тем, что состояние приложения reset, или что оно требуется больше времени для открытия. Я бы придерживался стандартного поведения, потому что это то, что ожидается.

Ответ 9

Вызов метода finish() для Activity имеет желаемый эффект для текущей активности.

Ответ 10

Ни один из вышеперечисленных ответов не работает хорошо в моем приложении

вот мой рабочий код

на кнопке выхода:

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
mainIntent.putExtra("close", true);
startActivity(mainIntent);
finish();

этот код должен закрыть любое другое действие и принести MainActivity сверху теперь на вашем MainActivity:

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

Ответ 11

Поместите оператор finish();, как показано ниже:

myIntent.putExtra("key1", editText2.getText().toString());

finish();

LoginActivity.this.startActivity(myIntent);

В каждом действии.

Ответ 12

@Override
    protected void onPause() {

        super.onPause();

        System.exit(0);

    }

Ответ 13

Невозможно с 2.3. Я много искал и пробовал много приложений. Лучшее решение - установить оба (go taskmanager) и (быстрая перезагрузка). Когда вы используете их вместе, он будет работать и освободит память. Другой вариант - перейти на андроид мороженого сэндвич 4.0.4, который позволяет контролировать (закрыть) приложения.

Ответ 14

Скопируйте ниже код и вставьте файл AndroidManifest.xml в раздел "Тег первой активности".

<activity                        
            android:name="com.SplashActivity"
            android:clearTaskOnLaunch="true" 
            android:launchMode="singleTask"
            android:excludeFromRecents="true">              
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"
                />
            </intent-filter>
        </activity>     

Также добавьте этот код ниже в разделе "Тег активности" в файле AndroidManifest.xml

 android:finishOnTaskLaunch="true"

Ответ 15

Мне хотелось вернуться на главный экран моего устройства Android, поэтому я просто использовал:

moveTaskToBack(true);

Ответ 16

Использование finishAffinity() может быть хорошим вариантом, если вы хотите закрыть всю активность приложения. Согласно Документам Android -

Finish this activity as well as all activities immediately below it in the current task that have the same affinity.

Ответ 17

public class CloseAppActivity extends AppCompatActivity
{
    public static final void closeApp(Activity activity)
    {
        Intent intent = new Intent(activity, CloseAppActivity.class);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
        activity.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        finish();
    }
}

и в манифесте:

<activity
     android:name=".presenter.activity.CloseAppActivity"
     android:noHistory="true"
     android:clearTaskOnLaunch="true"/>

Затем вы можете вызвать CloseAppActivity.closeApp(fromActivity), и приложение будет закрыто.

Ответ 18

Просто напишите следующий код в onBackPressed:

@Override
public void onBackPressed() {
    // super.onBackPressed();

    //Creating an alert dialog to logout
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("Do you want to Exit?");
    alertDialogBuilder.setPositiveButton("Yes",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    startActivity(intent);
                }
            });

    alertDialogBuilder.setNegativeButton("No",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });

    //Showing the alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
}

Ответ 19

путем вызова finish(); в кнопке OnClick или в меню

case R.id.menu_settings:

      finish();
     return true;

Ответ 20

Я думаю, что это закроет вашу деятельность и всю связанную с ней активность Sub.

public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();]
        if (id == R.id.Exit) {
            this.finishAffinity();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

Ответ 21

Лучший и самый короткий способ использования таблицы System.exit.

System.exit(0);

VM останавливает дальнейшее выполнение, и программа выйдет.