Каков наилучший способ создания BroadcastReceiver? - PullRequest
2 голосов
/ 03 октября 2011

Я потратил несколько дней, чтобы работать над Service + BroadcastReceiver, но все еще не могу сделать его идеальным. Я надеюсь, что кто-то может помочь, спасибо!

Я пишу приложение, которое отображает текущее местоположение пользователя на карте (карту, которую я написал, а не карту Google) и отправляет уведомление о тревоге, когда пользователь входит в предварительно определенную зону.

В моем коде. Есть два основных объекта. Служба GPS и основная деятельность.

Местоположение службы GPS передается при изменении местоположения. Основной вид деятельности получает последнее местоположение от BroadcastReceiver.

Я провел несколько исследований о том, как зарегистрировать BroadcastReceiver. Я нашел два способа:


Метод 1 - Регистрация приемника вещания в Activity (я использую этот метод в своем коде. Мне нужно обновить последнее местоположение на карте)

Main.java:

public class Main extends Activity{
.
.
.
    public class MyLocReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub

            Bundle bundle=intent.getExtras();
            String locData = bundle.getString("loc");

            // Some work


        }
        public MyLocReceiver(){
            Log.e(TAG, "in MyReceiver()");
        }

    }

    private MyLocReceiver myLocReceiver;

    // Register BroadcastReceiver
    if (myLocReceiver == null)
        {
            Common.writeFile("service.txt", "Main - in myBindService() register receiver" + "\n", true);

            myLocReceiver=new MyLocReceiver();

            registerReceiver(myLocReceiver, new IntentFilter("com.nwfb.LOC_DATA"));
        }

Метод 2 - Зарегистрируйте BroadcastReceiver на Manifest.xml

Manifest.xml:

    <receiver android:name=".LocationBoardcastReceiver" android:enabled="true"> 
            <intent-filter>
                <action android:name="com.abc.LOC_DATA" /> 
            </intent-filter> 
    </receiver>

LocationBoardcastReceiver.java:

    public class LocationBoardcastReceiver extends BroadcastReceiver {
        private static final String TAG = LocationBoardcastReceiver.class.getSimpleName();

        @Override
        public void onReceive(Context context, Intent intent) {

        Bundle bundle=intent.getExtras();
        // Do something
        }
    }

* То, что я хочу, это то, что BroadcastReceiver НЕ ДОЛЖЕН УБИВАТЬСЯ ОС во время жизни приложения. Также BroadcastReceiver должен иметь возможность передавать данные в мой Main.java

Я прочитал это актуальное: http://developer.android.com/reference/android/content/BroadcastReceiver.html

В разделе «Жизненный цикл приемника» и «Жизненный цикл процесса» указано, что BroadcastReceiver будет завершен и больше не будет активен после вызова onReceive (Context, Intent).

Я использую способ 1, я могу получить более 1 данных о местонахождении из службы. Я обнаружил, что BroadcastReceiver сохраняется, если BroadcastReceiver продолжает получать данные из Broadcast. Если я выключу GPS в «Настройке -> Местоположение» и оставлю BroadcastReceiver на 1-2 часа, то BroadcastReceiver будет убит ОС.


Убивает ли ОС BroadcastReceiver, если он простаивает слишком долго? Разве ОС НЕ уничтожает BroadcastReceiver, если он продолжает получать широковещательные сообщения?

Будет ли BroadcastReceiver (метод 1 и 2) уничтожен ОС, когда он находится в случаях чрезвычайного давления памяти?

Для метода 2, возможно ли, чтобы LocationBoardcastReceiver.java отправлял данные в текущее действие (например, Main, Java)?

Для метода 1 есть ли способ сохранить BroadcastReceiver живым в течение всего времени жизни Main.java (Основная деятельность)?

Ответы [ 2 ]

3 голосов
/ 03 октября 2011
  1. ОС Android может убить Сервисы и Действия в любое время.С этим ничего не поделаешь.

  2. Вы можете настроить приемник вещания на запуск службы, даже если приложение не активно.

  3. Есливы хотите получать обновления местоположения ВСЕ ВРЕМЯ, вам нужно будет постоянно активировать устройство.Это может разрядить батарею за считанные часы.

Для получения рекомендаций по обновлению местоположений прочитайте это: http://android -developers.blogspot.com / 2011/06 / deep-пикирующий в-location.html? т = 1

2 голосов
/ 03 октября 2011

Убивает ли ОС BroadcastReceiver, если он простаивает слишком долго?Разве ОС НЕ уничтожает BroadcastReceiver, если он продолжает получать широковещательную рассылку?

Будет ли BroadcastReceiver (метод 1 и 2) уничтожен ОС, когда он находится в условиях экстремального давления памяти?

Ваш приемник вступает в действие, когда он получает какое-либо уведомление, и его активная длительность составляет onReceive() Метод.

Для метода 2, возможно ли, что LocationBoardcastReceiver.java отправляет данные в текущее действие (например,: Main, java)?

Плохая идея.

Для метода 1 есть ли способ сохранить BroadcastReceiver живым в течение времени жизни Main.java (Основная деятельность)?

Проверьте выше.

Ваш лучший способ будет зависеть от того, что требуется вашему приложению.

  1. Если ваше приложение хочетчтобы использовать BroadcastReceiver, когда приложение находится на переднем плане, тогда вам нужно набрать Method1, как вы упомянули.

  2. Если вашему приложению нужно получать системное уведомление как Boot Completion и т. д., тогда вы должны перейтидля Method2s вы упомянули.

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