Как передать намерение широковещательному приемнику и запустить сервис Android

#java #android #service #alarmmanager #handler

#java #Android #Обслуживание #alarmmanager #обработчик

Вопрос:

Целевой API Java 30, Минимальный API 19

У меня есть сигналы тревоги, которые создаются потоком обработчика внутри моей службы переднего плана. У меня есть сигналы тревоги, которые устанавливаются в обработчике на основе пользовательских вводов. Я могу подтвердить, что время, передаваемое сигналам тревоги, указано правильно. Вот класс объекта alarm:

 public class StartAlarmObject  {
    private String name;
    private Context context;
    private int index;
    private int day;
    private long time;
    private NotificationManagerCompat notificationManager;
    private ArrayList<RestrictionObject> restrictions = new ArrayList<>();
    private ReadAndWriteRestrictions readAndWriteRestrictions = new ReadAndWriteRestrictions();
    private AlarmManager alarmManager;
    private PendingIntent pendingIntent;

    public StartAlarmObject (String name, Context context, int index, int day, long time)
    {
        this.name = name;
        this.context = context;
        this.index = index;
        this.day = day;
        this.time = time;
    }

    public void startAlarm() {
        System.out.println("starting alarm/alarm setting...");
        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(context, AlertReceiver.class);
        intent.putExtra("index", index);
        pendingIntent = PendingIntent.getBroadcast(context, (index * 100)   (day * 10), intent, 0);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent);
                System.out.println("setting exact and allowing while idle");
            } else {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
                System.out.println("setting exact");
                }
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
            System.out.println("just setting");
        }
    }

    public void cancelAlarm()
    {
        if (alarmManager!= null) {
            alarmManager.cancel(pendingIntent);
        }
    }

    public String getName() {
        return name;
    }
}
 

Я ожидаю, что я получаю инструкции println «точная настройка и разрешение во время ожидания», но я никогда не вижу никакой реакции от класса широковещательного приемника, которому я передаю намерение:

 package com.example.gotimejavaversion;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlertReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("alert received");
        Intent serviceIntent = new Intent(App.getContext(), TheRestrictor.class);
        serviceIntent.putExtra("caller", "alarm");
        System.out.println("The alarm reached the receiver");
        context.stopService(serviceIntent);
        context.startService(serviceIntent);
    }
}
 

Что мне нужно, чтобы связаться с широковещательным приемником или перезапустить службу, когда сработает сигнал тревоги?
Надеюсь, я просто упускаю что-то простое.

Спасибо!

Комментарии:

1. Зарегистрирован ли у вас приемник в манифесте?

2. Да, я знаю. Я также увеличил его приоритет на всякий случай, но, похоже, это не возымело никакого эффекта. ` <приемник android: name=». AlertReceiver» android: включено =»true» android: приоритет =»999″> </ receiver> `