Самый удобный способ использовать BroadcastReceiver в одиночку и более - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть синглтон, в котором хранится некоторая разумная информация о пользователе моего приложения. На данный момент он хранит логин и местоположение пользователя.

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

Однако для регистрации BroadcastReceiver мне нужен контекст в моем синглтоне. Какой самый приятный способ добиться того, чего я хочу. Возможно, BroadcastReceiver не является подходящим объектом?

2) Кроме того, на какие проблемы я смотрю при использовании синглтона? Я предполагаю, что Android, возможно, восстановит эту память в любой момент времени (что, очевидно, было бы плохо); так как я могу предотвратить это? Помешает ли это передать контекст приложения и сохранить его в переменной-члене?

Документация Android гласит: «Но жизненный цикл статики не находится под вашим контролем, поэтому для соблюдения модели жизненного цикла класс приложения должен инициировать и разрушать эти статические объекты в onCreate () и методы onTerminate () класса Application ", но я не совсем уверен, как этого добиться.

1 Ответ

5 голосов
/ 17 сентября 2010

Однако для регистрации BroadcastReceiver мне нужен контекст в моем синглтоне.Какой самый приятный способ добиться того, чего я хочу.Возможно, BroadcastReceiver не подходит> объекту?

"Самый ловкий способ" - не делать то, что вы делаете.Пожалуйста, зарегистрируйте BroadcastReceiver из Activity, Service или , возможно и Application.Вы должны отменить регистрацию этого BroadcastReceiver, когда Activity, Service или Application будут уничтожены.

Я предполагаю, что Android может восстановить эту память в любой моментданное время (что, очевидно, было бы плохо);так как я могу предотвратить это?

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

Храните в памяти только те вещи, которые вы не против потерять.

Лучше всего рассматривать ваше «приложение» как корзину слабо связанных компонентов, а не какмонолитная сущность.

Передача в контексте приложения и сохранение его в переменной-члене помешает этому?

Нет.

Документация Android гласит: «Но жизненный цикл статики не находится под вашим контролем, поэтому для соблюдения модели жизненного цикла класс приложения должен инициировать и разрушать эти статические объекты в onCreate () и onTerminate ().методы класса приложения ", но я не совсем уверен, как этого добиться.

Создайте подкласс Application и укажите в манифесте, что Android должен его использовать, через android:name атрибут элемента <application>.

...