我正在构建一个Android Alarm Applicaion,并使用以下代码进行主要调用类:
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.
服务类:
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设备关闭,设备是否可以在预定的时间响铃(设备在保存的时间自动开机响铃),如同Android设备的默认应用程序一样。
2)假设我准确地在8分钟后保存了警报并且我重启了我的设备然后警报在启动后立即开始响铃(因为我在清单中使用了“bootcomplete”接收器)但是我想在8分钟之后播放警报重启。(我已经在共享偏好中保存了警报,但是如何在重启时使用它)
编辑:我可以使用“电源管理器”类或任何其他类来处理上述情况吗?
答案 0 :(得分:0)
对于(1),如果你谈论完全关闭,那很遗憾是不可能的。没有专门的硬件(及其与应用程序相应的软件界面),就无法做到这一点。
对于(2),你可以做一些聪明的事情。例如,当设备重新启动/关闭时,持久存储时间戳(当您有待处理的警铃时,除了BroadcastReceiver
之外,还可以为ACTION_SHUTDOWN
注册BOOT_COMPLETE
)并使用重启/启动时的信息恢复(或停止,取决于时差和闹铃的“计时器”)或以其他方式重新同步待处理的警铃信号。
对于你的PowerManager
问题,如果我们谈论完全关闭,那么很遗憾答案是否定的。
PowerManager
主要用于防止设备进入深度睡眠状态。请记住,Android设备在锁定后会关闭CPU一段时间,从而阻止您的应用进行计算/处理。这基本上就是“唤醒锁”的概念。
答案 1 :(得分:0)
1)有可能......
不,不是完全断电。您最有可能将屏幕关闭且设备处于低功耗状态。如果设备完全关闭,则警报无法唤醒它。默认的Android时钟应用程序只是从睡眠中唤醒它。如果您想要唤醒屏幕并播放声音,则必须创建一个Service
,可以通过您的WakefulBroadcastReceiver
激活它并启动相应的用户界面。如果不这样做,那么系统可以在onReceive()
完成后立即返回查看。
2)...想在8分钟之后玩...
您可能看到的是警报触发之前到期并且您正在唤醒设备(未打开电源。)警报不会在电源循环或重新启动时保留。如果你希望在真正的重启后让它们坚持下去,那么你必须自己管理它。 PowerManager
和AlarmManager
不提供这样的便利。