Принудительное закрытие приложения убивает службу другого приложения с тем же общим идентификатором пользователя?

У меня есть 2 приложения с одинаковым значением SharedUserId в манифесте, App1 и App2. App1 имеет компонент службы, который указан для запуска в отдельном процессе (в манифесте android:process=":remote"). Основная цель этого сервиса — проверка App2. Я хотел бы, чтобы служба выполняла некоторую очистку, когда App2 закрывается.

Когда я принудительно закрою App2, служба App1 будет уничтожена, а ее метод onDestroy() не будет вызван. Как я могу гарантировать, что служба App1 не будет уничтожена (или, по крайней мере, завершится вызовом onDestroy), когда я принудительно остановлю App2?

редактировать: Android 4.0.1 на Galaxy Nexus, если это имеет значение


person Matt    schedule 04.07.2012    source источник


Ответы (1)


Да, это возможно. Если вы используете sharedUserId, представьте, что эти 2 приложения работают в одном и том же потоке, что означает, что у них один и тот же жизненный цикл приложения, что в основном означает, что с «принудительным закрытием» любого из этих приложений вы завершаете их поток.

Это означает, что все в этой теме убито. Один из негативных моментов в использовании sharedUserID и sharedProcess между приложениями, а не в использовании поставщиков контента.

Я не думаю, что есть обходной путь, когда вы принудительно закрываете приложение. Может быть, вы должны просто закончить его «нормальным» способом и позволить ОС убить его.

ОБНОВЛЕНИЕ из вашего комментария:

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

Это моя точка зрения. Несмотря на мое убеждение, есть способ вручную перезапустить ваше приложение после принудительного закрытия, когда сработало необработанное исключение, и я думаю, что реакция принудительного закрытия пользователем будет такой же. Я думаю, вы можете добавить ожидающее намерение в службу: Android: как автоматически перезапустить приложение после принудительного закрытия?

person 10s    schedule 04.07.2012
comment
Если бы это зависело от меня, я бы позволил ОС убить его. Я просто имею дело со случаем, когда пользователь решает убить его сам. Вынуждает ли sharedUserId, чтобы приложения находились в одном процессе? В документации указано, что они будут выполняться в одном процессе, если желанный. - person Matt; 04.07.2012
comment
Да, это правда, разве у вас нет такого же общего процесса в ваших приложениях? Я заметил, что для совместного использования ресурсов в двух приложениях вы должны включить один и тот же атрибут процесса в обоих приложениях. Несмотря на то, что только sharedUserID отлично работает с версиями 2.x, в 3.x и некоторых 4.0 он не работал. Я предполагаю, что это какие-то новые функции безопасности. У вас нет таких же проблем? - person 10s; 05.07.2012
comment
У меня нет такого же общего процесса в моих приложениях. Обмен данными работает нормально (я могу читать и записывать файлы App2 из App1). - person Matt; 05.07.2012
comment
вы тестировали его на устройстве версии 3.x? И под файлами вы подразумеваете доступ к базе данных, настройки или просто файлы, сохраненные во внутренней памяти? - person 10s; 05.07.2012
comment
Нет, я не тестировал его на устройстве 3.x. Думаю, можно попробовать на эмуляторе. Я только что обращался к файлам в локальном хранилище (включая файлы базы данных, но не делал никаких вызовов к этим базам данных с помощью SQLite) - person Matt; 05.07.2012
comment
Эмулятор 3.x — это боль, даже если вы пытаетесь загрузить его на мощную машину. Иногда даже не загружается. Удачи с этим. Вы не ответили на мой другой вопрос, вы обращаетесь к базе данных или просто к некоторым файлам в личном хранилище приложения? - person 10s; 05.07.2012
comment
Я отредактировал свой комментарий, но, возможно, он не появился у вас. Я только что получил доступ к файлам в локальном хранилище (включая файлы базы данных, но не делал никаких вызовов к этим базам данных с помощью SQLite). - person Matt; 05.07.2012
comment
Хорошо, тогда это другой случай, чем мой. Подводя итог, можно сказать, что ОС, похоже, убивает оба приложения, поэтому должно быть так, что приложения работают в одном и том же процессе. Я не знаю этого конкретного ответа о том, как отключить тот же самый процесс, но, как я уже писал выше, отредактированный комментарий, у меня есть очень хорошее альтернативное восприятие того, что вы пытаетесь сделать. Надеюсь, я помог - person 10s; 06.07.2012
comment
Это очень странно, потому что окно Logcat показывает, что два приложения имеют разные PID. Может быть, ОС Android убивает мой сервис из-за проблем с памятью? Это маловероятно на GNexus, где больше ничего не запущено, и мои приложения не так требовательны к памяти. Спасибо за ссылку. Я тоже смотрел на это. Можно ли разместить этот блок кода в службе? Мне казалось, что это нужно делать в Activity. Это было бы проблематично для меня, потому что моя служба не запускается при запуске, а только после некоторого ввода пользователя. - person Matt; 06.07.2012
comment
как указано в ссылке, вы также можете поместить ее в свой класс приложения. Если вы не используете пользовательский класс приложения, просто создайте его, чтобы разместить этот код. Если приложение закроется, этот код заново сгенерирует само приложение. Это очень распространенный трюк для восстановления приложения после необработанных исключений. - person 10s; 06.07.2012