Класс приложения Android не уничтожается при уничтожении последнего действия

При повторном запуске приложения onCreate класса приложения не вызывается. Первый раз вокруг это. Это можно воспроизвести, используя Android Studio для создания нового приложения, а затем добавив минимальный одноэлементный класс приложения:

package com.whatever.test;
import android.app.Application;
import android.content.Context;
import android.util.Log;

public class MyApp extends Application {
    private static MyApp singleton;

    public static MyApp getInstance(Context context) {
        Log.i("MyApp","---------->getinstance");
        return singleton;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        singleton = this;
        Log.i("MyApp","---------->act oncreate");
    }
}

и при добавлении активности в onCreate:

MyApp myApp = MyApp.getInstance(this);
Log.i("MainActivity", "-------->onCreate");

и в onDestroy:

@Override
    public void onDestroy()
    {
        super.onDestroy();
        Log.i("MainActivity", "-->onDestroy");
    }

Manifest.xml содержит:

 android:name=".MyApp"

Я нажимаю кнопку «Назад» в действии и вижу, что onDestroy вызывается, но этого явно недостаточно, чтобы удалить класс Application. Если я убью приложение с помощью диспетчера приложений телефона и повторно запущу, я снова увижу журнал App onCreate (но только для одного запуска).

Разве этот класс не должен быть уничтожен при удалении последнего действия? Это мое предположение. Конечно, я читал людей, говорящих, что этот класс может быть уничтожен во время работы приложения, поэтому вам приходится обрабатывать перезагрузку любого состояния в течение жизненного цикла приложения, но ничего не отражает мой сценарий.

Примечание. Проверено на физическом телефоне (Galaxy S3).


person Community    schedule 01.02.2014    source источник


Ответы (1)


В приложении также могут быть службы, поставщики содержимого, наблюдатели содержимого и т. д. Поэтому важно не привязывать срок службы приложения к действию. Приложение может быть уничтожено, когда оно скрыто, если ОС необходимо освободить ресурсы. Но в целом нельзя делать никаких предположений о том, когда это на самом деле произойдет.

Сохранение/перезагрузка состояния должна происходить в ваших действиях onCreate и onDestroy. Единственная гарантия, которую вы имеете, когда ваша активность скрыта (например, с помощью кнопки «Назад»), вызывается Activity.onStop.

Я рекомендую прочитать все о жизненном цикле Activity: Документация по классу Activity

Редактировать: Чтобы напрямую ответить на ваш вопрос: "Разве этот класс (приложение) не должен быть уничтожен при удалении последнего действия?". Ответ - нет. Единственный жизненный цикл, на который вы можете надежно рассчитывать, — это ваша активность. И даже в этом случае Activity.onDestroy не так надежен, как вы надеетесь. Нажатие кнопки «Назад», чтобы скрыть активность, гарантирует только вызов Activity.onStop. В классе Application даже нет метода onDestroy.

person Dane White    schedule 01.02.2014
comment
Спасибо за ответ, но ваш ответ, похоже, сосредоточен на действиях, а мой вопрос касается класса Application. - person ; 01.02.2014
comment
Я направляю вас к обсуждению действий, потому что ваше понимание приложений неверно. - person Dane White; 03.02.2014
comment
@DaneWhite, поэтому, пожалуйста, попробуйте еще некоторые разработки в классе Application, чтобы мы могли получить больше контекста. - person Dushyant Suthar; 16.06.2017
comment
Я не думаю, что нажатие кнопки «Назад» скрывает активность. Это фактически разрушает активность. Нажатие кнопки «Домой» скроет его (переместит на задний план). - person MD-11; 03.03.2018