在调用 AlarmManager 时启动 Android 设备

Booting Android Device on AlarmManager Call

我正在构建一个 Android 警报应用程序,并使用以下代码进行主调用 Class:

   AlarmManager inst_alarm= (AlarmManager) getSystemService(ALARM_SERVICE); 
   Intent intent =new Intent(MainActivity.this,Alarm.class);
   pintent= PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
   inst_alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),pintent);  

  //"cal" is reference of calendar class to get saved time in millisecond.

服务 Class:

public class Alarm extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context c, Intent i) {

    Uri uri_alarm= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

    if(uri_alarm==null)
    {           uri_alarm=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone_alarm=RingtoneManager.getRingtone(c, uri_alarm);
    ringtone_alarm.play();
        }
}

这段代码工作正常,但我有几个问题。

问题:1) 如果 android 设备关闭(设备自动开机以在保存的时间响铃),是否可以在预定时间响铃,如 [=28= 的默认应用程序] 设备会。

2) 假设我恰好在 8 分钟后保存了闹钟并重新启动我的设备然后闹钟在启动后立即开始响起(因为我在清单中使用 "bootcomplete" 作为接收器)但我想在 8 分钟后播放闹钟分钟完全不是在重新启动时。(我已经在共享首选项中保存了警报,但是如何在重新启动时使用它)

编辑:我可以使用 "Power Manager" class 或任何其他 class 来处理上述情况吗?

对于 (1),如果您在谈论完全关闭,不幸的是这是不可能的。如果没有专门的硬件(及其与您的应用程序对应的软件接口),就无法做到这一点。

对于(2),你可以做一些聪明的事情。例如,当设备 restarts/turns 关闭时(除了你的 BOOT_COMPLETE 之外,你还可以为 ACTION_SHUTDOWN 注册一个 BroadcastReceiver)当你有一个未决的警铃时,持久地存储时间戳,并在 reboot/boot 上使用该信息来恢复(或停止,具体取决于时差和闹钟的 "timer")或以其他方式重新同步待处理的闹钟逻辑。

对于您的 PowerManager 问题,如果我们再次谈论完全关闭,不幸的是答案是否定的。

PowerManager主要用于防止设备进入深度睡眠。请记住,Android 设备在锁定一段时间后会关闭其 CPU,从而阻止您的应用执行 calculations/processes。这本质上就是 "wakelocks" 的概念。

1) Is it possible...

不,不是完全关闭电源。您很可能指的是屏幕关闭且设备处于低功耗状态。如果设备完全关闭,则警报无法唤醒它。默认 Android 时钟应用程序只是将其从睡眠中唤醒。如果你想唤醒屏幕并播放声音,你必须创建一个 Service,它可以通过你的 WakefulBroadcastReceiver 激活,并让它启动适当的 UI。如果你不这样做,那么系统可以在你的 onReceive() 完成后立即返回 seep。

2) ...want to play 8 minutes after...

您可能看到的是之前的警报触发过期并且您正在唤醒设备(而不是打开它)。警报不会在电源循环或重新启动后保留。如果你想让它们在真正重启后仍然存在,那么你必须自己管理它。 PowerManagerAlarmManager 不提供此类功能。