我想构建一个非常简单的应用程序,它将每5分钟触发一次“叮”声,持续1小时。它还将在屏幕上显示进度。
到目前为止,我遇到的问题是,如果我使用AsyncTasks,Threads或Handlers,则后台任务会在手机进入睡眠状态时停止。
即使在后台或手机处于睡眠模式,该应用程序也必须能够播放“叮”声。
请告知要使用的体系结构或API。
答案 0 :(得分:2)
您应该使用WorkManager
安排任务,这是推荐的方法,可以帮您完成所有繁重的工作。
要了解更多信息,请访问official docs。
答案 1 :(得分:2)
我想构建一个非常简单的应用,每5个触发一次“叮” 分钟1小时。它还将在屏幕上显示进度。
答案 2 :(得分:0)
手机进入睡眠状态后,后台任务停止。
我建议您使用alarmmanager设置警报,并将setExactAndAllowWhileIdle
用于6.0或更高版本的设备。 (由@Jo Jo Roid here结帐的答案)
请建议使用哪种架构或API。
您可以获得long time = System.getCurrentTimeInMillis();
,然后将Calendar实例设置时间设置为calender.setTimeInMillis(time + (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);
}
当您的BroadcastReceiver接收到广播时,通过将当前时间增加5分钟来设置下一个警报。当您接收广播并从AlarmStream播放Ding声音时,重复此操作11次。简单!
您可能想知道“为什么不使用重复警报”。允许在M上方闲置时唯一的解决方法。
要显示进度,您可以显示notification with progressBar。 (因为如果用户离开应用程序或将其从最新消息中删除,您还会在其他地方显示进度吗?
P.S。不要忘记register your BroadcastReceiver并在清单中也请求WAKE_LOCK权限。
答案 3 :(得分:0)
您可以进行前台服务并在其中使用Timer类。 校验 https://developer.android.com/guide/components/services