Подтвердить что ты не робот

Приемник Android-Broadcast

Я новичок в android. Я знаю, что разница между Intent и BroadcastReceiver. Меня больше путают с BroadcastReceiver чем Intent.

Пожалуйста, помогите мне. Простой код будет полезен.

4b9b3361

Ответ 1

Хорошо, я объясню это на примере.

Предположим, я хочу создать приложение, чтобы проверить статус метро на его веб-странице. Я также хочу получить системное уведомление, если метро не работает нормально.

У меня будет:

  • Activity, чтобы показать результаты.
  • A Service, чтобы проверить, работает ли метро, ​​и показывать уведомление, если оно не работает.
  • A Broadcast Receiver называется Alarm Receiver для вызова службы каждые 15 минут.

Позвольте мне показать вам код:

/* AlarmReceiver.java */
public class AlarmReceiver extends BroadcastReceiver {
    public static final String ACTION_REFRESH_SUBWAY_ALARM =
          "com.x.ACTION_REFRESH_SUBWAY_ALARM";

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startIntent = new Intent(context, StatusService.class);
        context.startService(startIntent);
    }
}

Объяснение: Как вы можете видеть, вы можете установить будильник. и когда принимается сигнал тревоги, мы используем intent для запуска Service. В основном intent - это msg, который может иметь действия, сериализованный материал.

public class StatusService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        mAlarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intentToFire = new Intent(AlarmReceiver.ACTION_REFRESH_ALARM);
        mAlarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
    }

    @Override
    public void onStart(Intent intent, int arg1) {
        super.onStart(intent, arg1);
        Log.d(TAG, "SERVICE STARTED");
        setAlarm();
        Log.d(TAG, "Performing update!");
        new SubwayAsyncTask().execute();
        stopSelf();
    }

    private void setAlarm() {
        int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
        mAlarms.setInexactRepeating(alarmType, SystemClock.elapsedRealtime() + timeToRefresh(),
                    AlarmManager.INTERVAL_HALF_DAY, mAlarmIntent);
    }

}

Пояснение:

Запустится Service и:

  • Установите будильник для следующего вызова. (Проверьте намерение, которое он использовал. Просто сообщение)
  • Вызывает AsyncTask, который заботится об обновлении уведомления Activity

Нет смысла вставлять AsyncTask, но по завершении он вызывает:

private void sendSubwayUpdates(LinkedList<Subway> subways) {
      Intent intent = new Intent(NEW_SUBWAYS_STATUS);
      intent.putExtra("subways", subways);

      sendBroadcast(intent);
}

Это создает новый intent с определенным действием NEW_SUBWAYS_STATUS, помещенным внутри намерений в метро и sendBroadcast. Если кто-то заинтересован в получении этой информации, у него будет приемник.

Надеюсь, я поняла.

PS: Несколько дней назад кто-то объяснял трансляцию и намерения очень здорово. Кто-то хочет поделиться своим пивом, поэтому он отправляет трансляцию с намерением иметь действие: "FREE_BEER" и с дополнительным: "Стакан пива".

Ответ 2

В API говорится:

A BroadcastReceiver - базовый класс для кода, который будет получать намерения, отправленные sendBroadcast().

Цель - абстрактное описание выполняемой операции.

Итак, a BroadcastReceiver - это просто действие, которое отвечает на намерения. Вы можете отправлять свои собственные трансляции или даже Android-устройство может отправлять эти широковещательные широковещательные системы, включая такие вещи, как батарея, низкая или просто загруженное устройство.