Я гуглил эту тему, искал везде, ответ не работал.
Проблема:
В эмуляторе (API 27) и в моей заметке 8 в обоих:Я запускаю свое приложение с помощью android studio, в SettingsActivity нажимаю кнопку сброса, AlarmManager настроен на 2 минуты позже.Через 2 минуты уведомление отправляется в точное время, затем настраивается AlarmManager на 2 минуты позже, и так далее ... все в порядке.
Но когда я закрыл свое приложение, ничего не происходитРабота.нет записи в журнале, нет ошибки, нет уведомления или еще.
Все эти реализации предназначены для моделирования.В действительности, AlarmManager будет настроен на несколько дней.Когда он работает, служба выполняет некоторые работы, а затем настраивает диспетчер аварийных сигналов на другой день.
Здесь мои конфигурации:
Манифест:
...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
<service
android:name=".service.ServiceTest"
android:enabled="true"
android:exported="false"
android:icon="@drawable/ic_launcher"
android:label="Service Test" />
...
ServiceTest расширяет Сервис:
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
NotificationUtil.sendNotification(getApplicationContext());
Apps.alarmSet(getApplicationContext(), ServiceTest.TAG);
stopSelf(startId);
return super.onStartCommand(intent, flags, startId);
}
SettingsActivity-> ResetButton setOnClickListener:
Apps.alarmSet(getApplicationContext(), SettingsActivity.TAG);
ПриложенияКласс AlarmSet метод:
public static void alarmSet(Context context, String triggerName) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(calendar.getTimeInMillis() + 120000L); // 2 min later
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, ServiceTest.class);
PendingIntent pendingIntent = PendingIntent.getService(context, ServiceTest.SERVICE_ID, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null && pendingIntent != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
SmartLogger.appendLog(context, triggerName, "Alarm is setupped : " + DateUtil.millisToFormattedDate(calendar.getTimeInMillis(), "dd.MM.yyyy HH:mm"));
} else {
SmartLogger.appendLog(context, triggerName, "AlarmManager or PendingIntent is null");
}
}