我想构建一个非常简单的应用程序,它将每5分钟触发一次“叮”,持续1小时。它还将在屏幕上显示进度。
到目前为止我遇到的问题是,如果我使用AsyncTask、线程或处理程序,后台任务会在手机进入睡眠状态的那一刻停止。
即使在后台或手机处于睡眠模式,该应用程序也必须能够播放“叮”。
请建议使用什么架构或API。
您应该使用WorkManager
安排任务,这是推荐的方法,可以为您完成所有繁重的工作。要了解更多信息,请访问官方文档。
我想构建一个非常简单的应用程序,它将每5分钟触发一次“叮”,持续1小时。它还将在屏幕上显示进度。
>
您可以创建前台服务,它可以轻松更新通知以指示进度。请注意,此服务不会无限期运行,如果OS检测到您正在执行CPU密集的工作,此服务也可能被终止。您可以按照SO了解实施细节。
如果不强制每5分钟请求“叮”一次,您也可以使用WorkManager
。请注意,触发WorkManager
的最小频率为15分钟,您不能准确指出Work将在15分钟触发。您可以按照SO了解实现细节。
后台任务在手机进入睡眠状态的那一刻停止。
我建议您使用alarmmanager设置警报,并为6.0或更高版本的设备使用setExactAndAllowWhileIdle
。(在此处查看@Jo Jo Roid的答案)
请建议使用什么架构或API。
你可以得到long time=System. getCurrentTimeInMillis();
然后创建日历实例设置时间到calender.setTimeInMillis(时间(5*60*1000));
AlarmManager am;
Intent intent = new Intent(this, YourBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
if (Build.VERSION.SDK_INT >= 23) {
// Wakes up the device in Doze Mode
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time,
pending);
} else if (Build.VERSION.SDK_INT >= 19) {
// Wakes up the device in Idle Mode
am.setExact(AlarmManager.RTC_WAKEUP, time, pending);
} else {
// Old APIs
am.set(AlarmManager.RTC_WAKEUP, time, pending);
}
当您的广播接收器接收到广播时,通过在当前时间上增加5分钟来设置下一个警报。当您收到广播并从警报流播放丁音时,重复此操作11次。简单!
您可能想知道“为什么不使用重复警报”。好吧,在M以上空闲时允许这是唯一的解决方法。
为了显示进度,您还可以使用进度栏显示通知。(因为如果用户离开应用程序或从最近的应用程序中删除它,您还会在哪里显示进度?
附言:不要忘记注册您的广播接收器,并在清单中请求WAKE_LOCK许可。