У меня есть старое приложение, в котором служба вызывалась с использованием AlarmManager
setExact
каждую минуту, но в последней версии Android O это не позволяет мне запускать службу таким же образом. Я не мог использовать службу переднего плана, потому что не хочу показывать никаких уведомлений, когда моя служба работает.
Мне нужна помощь в настройке архитектуры моего приложения таким образом, чтобы мой код работал в Android O с минимальными изменениями.
Когда я запускаю свое приложение на Android, происходит сбой :(. Найдите трассировку стека сбоя ниже.
java.lang.RuntimeException: Unable to create application com.***.***.***ControllerApplication: java.lang.IllegalStateException: Not allowed to start service Intent
Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.***.***.qa/com.***.***.services.AlarmService
Редактировать:
Задача в моем приложении критична по времени, поэтому я использовал setExact
в AlarmManager
, но ни один из поддерживаемых в настоящее время API не планирует задания в точное время. С учетом сказанного, Если я использую JobScheduler / WorkManager, мое приложение будет работать неправильно.
Используйте планировщик заданий или менеджер работы
Диспетчер работ находится в альфа-версии, и планировщик заданий не может запланировать задание на точное время.
Вы можете использовать диспетчер сигналов тревоги, который будет вызываться каждые 10 минут.
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
notificationIntent.setClass(this,AlarmReceiver_.class);
notificationIntent.addCategory("android.intent.category.DEFAULT");
PendingIntent broadcast = PendingIntent.getBroadcast(YourClass.this, r5, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 300000L,
600000L, broadcast);
Код приемника ManiFest, на который вы получите ответ приемника
<receiver android:name = "com.yourpackage.AlarmReceiver_"
>
<intent-filter>
<action android:name = "android.media.action.DISPLAY_NOTIFICATION" />
<category android:name = "android.intent.category.DEFAULT" />
<action android:name = "android.intent.action.QUICKBOOT_POWERON" />
<action android:name = "android.intent.action.REBOOT" />
<action android:name = "android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Вам нужно будет создать Receiver, где вы будете получать данные как указанное выше имя AlarmReceiver_.class
Я уже использую AlarmManager, чтобы повторить задание, проблема в том, что запуск задания с помощью AlarmManager выдает исключение в Android O.
Не могли бы вы показать мне, как вы вызываете диспетчера аварийных сигналов?
@SyedTarufNaqvi Ваша проблема решена, если нет, то дайте мне знать.
использовать планировщик заданий