java - Android 如何设置精确的重复闹钟?
问题描述
我正在构建一个警报应用程序,它将具有精确的重复警报。
看到Repeating
Android 如何仅Inexact
提供可能延迟为所选间隔的 75% 的警报,我尝试制作Exact
警报,该警报在触发时再次设置。只要我的屏幕一直亮着,这种类型的警报就可以完美地工作。但是一旦它进入睡眠状态,闹钟第一次就可以正常工作,但是以编程方式设置的第二个闹钟会延迟触发,就好像我正在使用Inexact
方法一样。
作为替代解决方案,我正在考虑制作一个InexactRepeating
警报,该警报将每分钟触发一次以检查它是否是“时间”。这样我的警报将具有 2 分钟的不精确间隔,这是可以接受的。但我不确定它会对手机的电池造成多大的压力。
有什么想法吗?
这是我的Exact
警报尝试:
AlarmManager.java
public static void setAlarm(Context context){
AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
//SET BROADCAST RECEIVER WHICH WILL BE THE ONE TO LISTEN FOR THE ALARM SIGNAL
Intent intent = new Intent(context, AlarmTriggerBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 22222, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//SETING THE ALARM
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
} else {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
}
}
AlarmTriggerBroadcastReceiver.java
public class AlarmTriggerBroadcastReceiver extends BroadcastReceiver {
private final static String TAG_ALARM_TRIGGER_BROADCAST = "ALARM_TRIGGER_BROADCAST";
@Override
public void onReceive(Context context, Intent intent) {
//WAKE UP DEVICE
WakeLocker.acquire(context);
//LAUNCH PAGE
Intent intent1 = new Intent();
intent1.setClassName(context.getPackageName(), SomeActivity.class.getName());
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
Toast.makeText(context, "TOAST ALARM", Toast.LENGTH_LONG).show();
};
//SET NEW ALARM
AlarmManagerActivity.setAlarm(context);
WakeLocker.release();
}
}
WakeLocker.java
//WAKES UP DEVICE IF PHONE'S SCREEN LOCKED
public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;
public static void acquire(Context ctx) {
//if (wakeLock != null) wakeLock.release();
PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, "myapp:WAKE_LOCK_TAG");
wakeLock.acquire();
}
public static void release() {
if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}
Manifest
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.SET_ALARM"/>
<receiver
android:name=".Alarm.AlarmTriggerBroadcastReceiver"
android:process=":remote">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
<intent-filter android:priority="1">
<action android:name="my.app.here.ALARM_RECIEVED" />
</intent-filter>
</receiver>
各位程序员,怎么办?
解决方案
推荐阅读
- php - 自动从某个目录导入所有 CSS 文件的 PHP 函数
- java - 玉兰日志中的 AbstractFieldFactory 警告
- python - 从 Python 中的字符表达式创建列表的优雅方式
- javascript - page.js 库:如何启用 onbeforeunload?
- java - RemoteServer - 如何在 Robotframework 中使用 Java 关键字?
- python - python绘制特征向量
- .htaccess - htaccess localhost - mod-rewrite,htdocs,mamp
- angular - Angular中contentEditable元素上的focus()不起作用
- html - 我的页面上的课程数量如何计算并显示在我的菜单中?
- javascript - VueJS 模板 - 在登录表单和注册表单之间翻转