Подтвердить что ты не робот

Android: OnDestroy не вызывается, когда я закрываю приложение с помощью кнопки последних приложений

Когда мы нажимаем эту кнопку

Мы видим приложения, которые мы не закрывали, например

Но когда мы хотим закрыть приложение с этого экрана (ниже изображения), метод onDestroy() не вызывается, однако приложение закрыто. Мне нужно вызвать onDestroy(), когда приложение закрыто таким образом. Как я могу это сделать?

4b9b3361

Ответ 1

Как указано в документации Android, не гарантируется, что при выходе из приложения будет вызван onDestroy().

"Бывают ситуации, когда система просто завершает процесс хостинга активности, не вызывая этот метод"

https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

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

Создайте класс обслуживания:

public class ClosingService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);

        // Handle application closing
        fireClosingNotification();

        // Destroy the service
        stopSelf();
    }
}

Объявите/зарегистрируйте свой сервис в манифесте (внутри тега приложения, но вне тегов активности):

<service android:name=".services.ClosingService"
             android:stopWithTask="false"/>

Если указать stopWithTask="false", метод onTaskRemoved() будет запущен в вашей службе при удалении задачи из процесса.

Здесь вы можете запустить логику закрытия вашего приложения перед вызовом stopSelf() для уничтожения Сервиса.

Ответ 2

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

Укажите, пожалуйста, что вы пытаетесь достичь, и я постараюсь предложить лучшее решение.

Предложение

Итак, если я правильно понял, я могу предложить одно. Запустите a Service, который будет срабатывать LocalBroadcast каждые N секунд (это не очень тяжело для системы). Зарегистрируйтесь и BroadcastReceiver для этой трансляции в Activities. Таким образом вы получите true или false в зависимости от того, есть ли BroadcastReceiver, который может поймать ваш LocalBroadcast. И если нет приемников, чем проверка на какое-то значение SharedPreferences, указывающее, было ли нажато Button.

Ответ 3

Более перспективный подход, чем использование связанной службы, заключается в использовании обратных вызовов жизненного цикла активности в приложении. Хотя подход, показанный в принятом ответе, будет работать, но служба будет работать в фоновом режиме, пока действие не будет прекращено, что является дорогостоящим. Вместо этого я бы предложил использовать вашу реализацию Application.

1) Создайте класс, расширяющий Application, затем используйте его, указав его имя в атрибуте name тега Application в файле манифеста

class MusicPlayerApplication: Application() {
    private val TAG = MusicPlayerApplication::class.java.simpleName

    override fun onCreate() {
        super.onCreate()

        registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
            override fun onActivityPaused(activity: Activity?) {

            }

            override fun onActivityResumed(activity: Activity?) {
            }

            override fun onActivityStarted(activity: Activity?) {
            }

            override fun onActivityDestroyed(activity: Activity?) {
                Log.d(TAG, "onActivityDestroyed: ")
                val activityName = activity!!.localClassName
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
            }

            override fun onActivityStopped(activity: Activity?) {
            }

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            }
        })
    }
}

AndroidManifest.xml

<application
            android:name=".MusicPlayerApplication"
....

Я протестировал этот подход с использованием logcat, мой onDestory не вызывается, но onActivityDestroyed в обратном вызове вызывается каждый раз, когда я прекращаю активность из ОЗУ, но этот документ говорит, что onActivityDestroyed будет вызван, когда вызывается onDestory действия, но, похоже, этого не происходит. Тем не менее, я считаю этот подход лучше, чем использование услуг.

Ответ 4

Ваша проблема в том, что onDestroy вызывается только в Service. В Activity вызываемый метод onPause() Поместите просто в свою деятельность поле:

@Override
public void onPause()
{
//Put your Code here
}