Android-приложение не вызывает onDestroy (), когда его убивают (ICS)

Я занимаюсь разработкой приложения для Android с использованием связи Bluetooth (с использованием пропатентованного протокола), и мне нужно уловить момент, когда приложение будет убито.

Я хотел использовать & quot; onDestroy () & quot; метод, но он не вызывается каждый раз, когда приложение убивается. Я заметил, что он вызывается, когда я нажимаю кнопку «Назад» и только иногда, когда я убиваю приложение из диспетчера задач.

Вопрос в том, как я могу поймать момент, когда приложение было убито?

Вот код, который я пытался использовать:

@Override
public void onDestroy() {
    sendMessage(msg);
    Log.d("SampleApp", "destroy");
    super.onDestroy();
}

@Override
public void finish(){

    sendMessage(msg);
    Log.d("SampleApp", "finish");
    super.finish();
}

К сожалению, метод finish () никогда не вызывается, и onDestroy не вызывается каждый раз, когда я закрываю приложение из диспетчера задач.

Как я могу справиться с этим?

 The Good Giant13 июл. 2012 г., 17:51
Мне обоим это хорошо, я хотел бы уловить момент, когда пользователь убивает приложение из диспетчера задач (или долго нажимать на домашний экран и убивает приложение оттуда, в сэндвиче с мороженым), но это также нормально ловить момент, когда пользователь нажимает кнопку HOME или BACK, глядя на мою активность.
 The Good Giant04 июл. 2018 г., 16:11
Да, с решением ниже ..
 Devunwired13 июл. 2012 г., 17:48
Вы имеете в виду, когда приложение убивается системой, когда пользователь нажимает «Force Stop» в настройках или просто когда нажимается кнопка «HOME» или «BACK», когда вы смотрите на свою активность?
 Essam Mahdy29 июн. 2018 г., 01:02
Ты решил это?

Ответы на вопрос(3)

Решение Вопроса

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

РЕДАКТИРОВАТЬ:

Из ваших комментариев кажется, что вы хотите запускать некоторый код всякий раз, когда ваше приложение переходит в фоновый режим, но не в том случае, если оно ушло в фоновый режим, потому что вы запустили намерение. AFAIK, в Android нет метода, который бы обрабатывал это по умолчанию, но вы можете использовать что-то вроде этого:

Иметь логическое значение, подобное:

boolean usedIntent = false;

Теперь, прежде чем использовать намерение, установите логическое значение true. Теперь в вашем onPause () переместите код для случая намерения в блок if, подобный этому:

if(usedIntent)
{
//Your code
}

Наконец, в вашем onResume () снова установите для логического значения значение false, чтобы оно могло правильно переносить приложение в фоновый режим без намерения.

 The Good Giant13 июл. 2012 г., 17:54
Я уже прочитал его, но проблема в том, что, если я помещу свой код в onPause (), он будет выполнен также, если я начну новое намерение в своем приложении. Вместо этого я хотел бы отправить свое сообщение, только когда вызывается onPause, чтобы вернуться на главный экран.
 The Good Giant13 июл. 2012 г., 17:59
скажем, я хотел бы знать, когда мое приложение больше не отображается (поэтому оно по какой-либо причине переходит в фоновый режим), но я не хочу ничего делать, когда намерение началось, потому что я начал новое намерение с моего приложение
 13 июл. 2012 г., 17:56
Только домашний экран или другое приложение, например, когда поступает звонок, или пользователь просматривает уведомление?

если процесс был прерван внешними средствами (т. Е. Уничтожено по причинам памяти или пользователь принудительно остановил приложение). Вам придется обходиться с обратными вызовами, которые вы получили, когда ваше приложение ушло в фоновый режим для очистки вашего приложения.

finish() вызывается системой только тогда, когда пользователь нажимает кнопку НАЗАД из вашей Активности, хотя часто она вызывается приложениями напрямую, чтобы выйти из Активности и вернуться к предыдущей. Технически это не обратный вызов жизненного цикла.

onDestroy() вызывается только в Activity в результате вызоваfinish()так что в основном только тогда, когда пользователь нажимает кнопку НАЗАД. Когда пользователь нажимает кнопку HOME, активность переднего плана только проходитonPause() а такжеonStop().

Это означает, что Android не предоставляет много обратной связи с деятельностью, чтобы отличить пользователя, идущего домой, от перехода к другой активности (из вашего приложения или любого другого); Сама деятельность просто знает, что ее больше нет на переднем плане. Android-приложение представляет собой скорее набор «Деятельностей», чем тесно интегрированную единственную концепцию (к которой вы привыкли на других платформах), поэтому нет реальных системных обратных вызовов, чтобы узнать, когда ваше приложениеas a whole был перенесен или перемещен назад.

В конечном счете, я настоятельно призываю вас пересмотреть архитектуру вашего приложения, если оно опирается на знание того, находится ли ЛЮБАЯ активность в вашем приложении на переднем плане, но в зависимости от ваших потребностей, для достижения этой цели могут быть другие способы, более дружественные к среде. Одним из вариантов является реализация связаннойService внутри вашего приложения, что каждыйActivity связывает, пока активен (то есть междуonStart() а такжеonStop()). Это дает вам возможность использовать тот факт, чтоService живет только до тех пор, пока клиенты привязаны к нему, поэтому вы можете отслеживатьonCreate() а такжеonDestroy() методыof the Service знать, когда текущая задача переднего плана не является частью вашего приложения.

Вы также можете найтиЭта статья написанная Дайанной Хэкборн как интересная, более подробно освещающая архитектуру Android и то, как Google считает, что ее следует использовать.

 24 июн. 2017 г., 10:59
 07 апр. 2014 г., 17:12
Я думаю, что это более правильный способ, я также думаю, что он должен добавить интерфейс (или абстрактный класс) в приложение, чтобы принудительно применить вновь добавленные действия (или компоненты), чтобы определить поведение для этого.

Вот что вы можете сделать, если егоjust about stopping service когда приложение убито, проводя из списка последних приложений.

Внутри вашего файла манифеста сохраняйте флагstopWithTask какtrue для обслуживания. Подобно:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

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

Inside your Manifest file, keep flag stopWithTask as false for Service. Like:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="false" />

Now in your MyService service, override method onTaskRemoved. (This will be fired only if stopWithTask is set to false).

public void onTaskRemoved(Intent rootIntent) {

    //unregister listeners
    //do any other cleanup if required

    //stop service
    stopSelf();  
}

обращатьсяэтот вопрос для более подробной информации, которая также содержит другую часть кода.

Start service like below

startService(new Intent(this, MyService.class));

Надеюсь это поможет.

Ваш ответ на вопрос