Почему intent.getAction () в onReceive моего BroadcastReceiver возвращает ноль? - PullRequest
0 голосов
/ 26 июня 2019

Я хочу активировать функцию onReceive BroadcastReceiver в определенное время.Фрагмент, который создает IntentFilter и / или регистрирует BroadcastReceiver, не существует, когда событие инициируется.Может ли это быть причиной того, что intent.getAction в методе onReceive возвращает значение null?В чем ошибка в моем коде?Как правильно использовать параметр намерения метода onReceive BroadcastReceiver?

Когда я явно вызываю метод sendBroadcast, все работает нормально.Но это выполняется сразу после получения.Я хочу, чтобы он выполнялся в указанное время.

AddEditReminderFragment.java


    public class AddEditReminderFragment extends Fragment {
    ...
    public static final String NOTIFICATION_INTENT_ACTION = BuildConfig.APPLICATION_ID + ".NOTIFICATION_INTENT_ACTION";
    private AlarmManager alarmManager;
    private AlarmReceiver alarmReceiver = new AlarmReceiver();

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        ...
        alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
        ...
    }

    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        ...
        saveReminder();
        ...
    }

    private void saveReminder() {
        ...
        Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmDateTime.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime.getTimeInMillis(), pendingIntent);
        } 
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(alarmReceiver, new IntentFilter(NOTIFICATION_INTENT_ACTION));
        getFragmentManager().popBackStack();
    }

    public void onDestroyView() {
        super.onDestroyView();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(alarmReceiver);
    }
    ...
    }

AlarmReceiver.java


    public class AlarmReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i("rahul", "Broadcast received: " + action);
        if (action.equals(AddEditReminderFragment.NOTIFICATION_INTENT_ACTION)) {
            sendNotification(context, intent.getStringExtra("notificationTitle"));
        }
    }
    ...
    }

AndroidManifest.xml


    ...
    <receiver android:name=".receivers.AlarmReceiver"
              android:enabled="true">
        <intent-filter>
            <action android:name="com.example.todo.NOTIFICATION_INTENT_ACTION" />
        </intent-filter>
    </receiver>
    ...

Ожидается, что на выходе Logcat будет отображаться действие намерения, но фактический вывод будет таким, как показано ниже:

Подробный вывод Logcat отфильтрован по строке поиска "rahul"

06-26 11:47:56.011 4321-4321/com.example.todo I/rahul: Broadcast received: null

1 Ответ

1 голос
/ 26 июня 2019

Вам нужно установить действие на Intent, которое вы используете для создания PendingIntent.

 Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
 alarmIntent.setAction("com.example.todo.NOTIFICATION_INTENT_ACTION");
 PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0);

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

...