Android: onDestroy () або подібний метод у класі Application


75

Я розширюю клас Application для роботи з деякими глобальними змінними, які потребують контексту. Я знаю, що в класі Application є метод onCreate (), який викликається перед будь-яким іншим onCreate () у діях, але я хотів би знати, чи є в класі Application onDestroy () або подібний метод, який можна перевизначити, так що я зможе зберігати змінні в постійній пам'яті, скасувати реєстрацію прослуховувача та відправити останнє повідомлення на сервер до того, як процес програми буде вбито? Якщо ні, чи є інший спосіб це зробити?


Ні, робіть це відповідними методами ActivityабоService
Michael Butscher

13
Вже це зробив. Яка неприємність. Насправді, сама причина, по якій я розширюю заявку, полягає в тому, що використання служби android викликає у мене бажання заплакати ... або зістрибнути з будівлі :(
Можливо, Юлій

Відповіді:


33

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

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


8

В android немає концепції закриття програми. Користувач просто залишає: це єдина подія, про яку ви будете знати ( onPause()під час діяльності). Ви повинні розробити свою програму так, щоб вона відповідала цьому життєвому циклу.

Як правило, слід зберігати будь-які зміни негайно, але асинхронно, щоб інтерфейс не зависав. Це набагато краще, ніж зберігати зміни в onPause()тому, що якщо щось погане трапляється до того, як додаток буде призупинено (програма виходить з ладу, у користувача закінчується заряд акумулятора), усі дані вже збережено належним чином.

SharedPreferencesвже зберігати зміни асинхронно, тому якщо ви ними користуєтесь, вам більше нічого робити. В іншому випадку ви можете використовувати програми Kotlin, або якщо ви використовуєте Java, старий добрий AsyncTask- це чудово.


5

Ви можете замінити onDestroy()те, Activityяке буде останнім закритим у вашому додатку, і перевірити, чи не закінчується. У цьому випадку ваш код не буде викликаний при обертанні пристрою. Але слід пам’ятати, що onDestroy()це не викликається, коли додаток закрито кнопкою додому на пристрої.

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}

4

Перш за все: я абсолютно новачок

Мені потрібно виконати певний код при виході мого додатка (так, я не знаю такого в Android), і це добре працює для мене:

-У мене є MyApplication, який розширює додаток. Як член MyApplication існує поле AtomicInteger з назвою activeActivitiesNumber та метод загального отримання.

-Усі додаткові дії розширюють MyActivy (що саме поширює Діяльність)

-MyActivity замінює методи методів Create, onResume та onStop, а також має захищене поле: Protected MyAppication mAppState;

a) OnCreate(){
super.onCreate();
mAppState=this.getApplication();...}


b) onResume(){
super.OnResume();
myAppState.getactiveActivitiesNumber().addAndGet(1)
....}

c) onStop(){
super.onStop()

if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){
...call exiting code (for instance a public method defined in MyApplication}
}

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

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

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


2

Ви можете використовувати registerActivityLifecycleCallbacks()в класі Application із такими зворотними викликами (я рекомендую створити AppLifecycleCallbacksклас, який розширює ActivityLifecycleCallbacks):

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.