提问者:小点点

Android:在后台运行的简单计时器


我想构建一个非常简单的应用程序,它将每5分钟触发一次“叮”,持续1小时。它还将在屏幕上显示进度。

到目前为止我遇到的问题是,如果我使用AsyncTask、线程或处理程序,后台任务会在手机进入睡眠状态的那一刻停止。

即使在后台或手机处于睡眠模式,该应用程序也必须能够播放“叮”。

请建议使用什么架构或API。


共3个答案

匿名用户

您应该使用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许可。