如何在 Android 中准确运行逻辑?

问题描述 投票:0回答:0

背景和流程

我正在为 Android API 31+ 构建应用程序。 (在 Andorid 33/31 硬件上测试) 我的应用程序应该用作闹钟,但在发出警报之前进行逻辑检查,逻辑检查使用来自网络的数据,这些数据需要在警报时是最新的。

  • 目前我正在使用 Alarmmanager 设置闹钟。
  • BroadcastReceiver 收到警报,然后启动一个运行线程的前台服务,该线程从 Web 下载一些数据。
  • 下载数据后,线程向同一个接收器发送广播(但具有不同的意图数据)。
  • BroadcastReceiver 运行一些逻辑检查数据是否与警报中的某些参数相对应。
  • 如果逻辑检查出来,警报将作为发出铃声的前台服务触发。

问题:

但是,此应用程序不会在打瞌睡模式下的确切时间触发。
只要手机不打瞌睡,只要应用程序处于打开状态、后台状态或关闭状态,它就可以工作。
如果我在设置的闹钟时间后手动将手机从打瞌睡中唤醒,它会触发服务启动。

应用程序有权限

    <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);

打瞌睡时警报仍无法响起。为什么?

java android android-service alarmmanager foreground-service
© www.soinside.com 2019 - 2024. All rights reserved.