背景和流程:
我正在为 Android API 31+ 构建应用程序。 (在 Andorid 33/31 硬件上测试) 我的应用程序应该用作闹钟,但在发出警报之前进行逻辑检查,逻辑检查使用来自网络的数据,这些数据需要在警报时是最新的。
问题:
但是,此应用程序不会在打瞌睡模式下的确切时间触发。
只要手机不打瞌睡,只要应用程序处于打开状态、后台状态或关闭状态,它就可以工作。
如果我在设置的闹钟时间后手动将手机从打瞌睡中唤醒,它会触发服务启动。
应用程序有权限
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
POST_NOTIFICATIONS
, SCHEDULE_EXACT_ALARM
, REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
在运行时被请求和检查。
闹钟设置为:
Bundle bundle = new Bundle();
bundle.putParcelable(Vocabulary.ALARM_OBJECT, alarm);
Intent weatherAlarmSchedulerIntent = new Intent(context, AlarmReceiver.class)
.putExtras(bundle)
.putExtra(AlarmReceiver.BROADCAST_TYPE, AlarmReceiver.BROADCAST_TYPE_SCHEDULED_ALARM);
weatherAlarmSchedulerIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmId, weatherAlarmSchedulerIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), pendingIntent);
服务开始于
context.startForegroundService(intent);
startForeground(notification.hashCode(), notification);
方法。
网络数据检索服务使用
sendBroadcast(dataRetrivalIntent);
调用广播接收器。
权限检查:
requestPermissions(new String[]{Manifest.permission.SCHEDULE_EXACT_ALARM}, Vocabulary.PERMISSION_SCHEDULE_EXACT_ALARMS);
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);`
和
requestPermissions(permissions, Vocabulary.PERMISSION_POST_NOTIFICATION);
打瞌睡时警报仍无法响起。为什么?