Как сообщить ваше (не запущенное) приложение из получателя Boot_completed? - PullRequest
1 голос
/ 13 января 2010

Я зарегистрировал BOOT_COMPLETED Receiver в своем приложении, я хочу прослушать изменения в базе данных SMS.

BroadcastReceiver запускает временную службу, которая регистрирует ContentObserver. Теперь я хочу уведомить мою основную деятельность (которая не запущена), что Наблюдатель был зарегистрирован успешно. (Я хочу сделать это, потому что, если пользователь устанавливает приложение в первый раз, он не перезагружает свой телефон, но также нуждается в ContentObserver. Если у вас есть другая идея, как это сделать, вы можете опубликовать его. Мне просто нужна информация что наблюдатель уже зарегистрирован)

Моя идея состояла в том, чтобы уведомить активность статическим атрибутом: MyActivity.sObserverRegistered = true

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

спасибо

1 Ответ

1 голос
/ 13 января 2010

У вас гораздо большие проблемы.

хочу прослушать изменения в смс База данных.

В Android SDK нет "базы данных SMS" или даже поставщика содержимого SMS. Попытка получить доступ к закрытому частному, недокументированному содержимому неприкасаемых приложений SMS будет срываться на некоторых устройствах, сломаться в будущих версиях Android, не будет работать со сторонними приложениями SMS и, как правило, является плохой идеей. *

BroadcastReceiver запускает временная служба, которая регистрирует ContentObserver.

Не существует такого понятия, как временный Service, который регистрирует ContentObserver.

Возможно, Service не является временным, поэтому ваш ContentObserver остается зарегистрированным, а ваш Service не выключен. Это может произойти, например, если ваш BroadcastReceiver называется startService(), а ваш Service не вызывает stopSelf() (например, это не IntentService). Это не здорово, потому что вы сейчас затягиваете процесс. Но если вы можете убедить своих пользователей, что это нормально, что вы связываете процесс, это лучший ответ, и ваша деятельность может просто (повторно) запустить службу при запуске операции, чтобы гарантировать, что ContentObserver зарегистрирован.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...