- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个 AlarmManager 计划每天 23:59 触发一次,另一个同时触发,但每周触发一次。
下面是执行此操作的两个函数:
private fun midnightTimeClearCache(dataType: DataType, requestCode: Int) {
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.HOUR_OF_DAY, 23)
calendar.set(Calendar.MINUTE, 59)
val intent = Intent(context, ClearDataReceiver::class.java)
intent.putExtra(ClearDataReceiver.DATA_TYPE_EXTRA, dataType.name)
val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
}
private fun weekTimeClearCache(dataType: DataType, requestCode: Int) {
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.HOUR_OF_DAY, 23)
calendar.set(Calendar.MINUTE, 59)
var i: Int = calendar.get(Calendar.WEEK_OF_MONTH)
calendar.set(Calendar.WEEK_OF_MONTH, i++)
val intent = Intent(context, ClearDataReceiver::class.java)
intent.putExtra(ClearDataReceiver.DATA_TYPE_EXTRA, dataType.name)
val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
}
下面是作为上述未决 Intent 的一部分应该被解雇的接收者
class ClearDataReceiver : DaggerBroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
var bundle = intent!!.extras
val dataTypeString = bundle.getString(DATA_TYPE_EXTRA)
val dataType = DataType.valueOf(dataTypeString)
Log.d("JJJ", "clearing data for " + dataTypeString)
when (dataType) {
DataType.CUSTOMER_DETAILS -> {
storage.clearDetails()
storageClearSchedular.setCustomerDetailsClear()
}
DataType.CUSTOMER_PIC -> {
storage.clearPic()
storageClearSchedular.setPicClear()
}
}
这是我的 list :
还有启动接收器,这样我就可以重置警报管理器
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("JJJ", "onReceive")
storageClearSchedular = StorageClearSchedular(context!!, context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager)
storageClearSchedular.setAllSchedulars()
当我设置上述警报管理器时间表,然后在我 sleep 前从后台终止应用程序时,我再次加载该应用程序,发现它没有执行我的广播接收器(没有日志和数据的详细信息已清除)。
应该发生的是它应该在我设置的时间或每周一次执行每个数据,然后在它被触发后再次设置它,但它似乎根本不起作用。
我首先尝试了 setRepeating,但它没有作为 im 目标设备从 api 19 及更高版本工作
我错过了什么?
最佳答案
对于 19 以上的 api 版本,请使用此代码
if (Build.VERSION.SDK_INT < 19) {
alarmManager.set(AlarmManager.RTC,
calendar.getTimeInMillis(), pendingIntent);
}
} else if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT <= 22) {
alarmManager.setExact(AlarmManager.RTC,
calendar.timeInMillis, pendingIntent)
} else if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC,
calendar.timeInMillis, pendingIntent)
}
对于每日闹钟,您可以查看情况。此示例将每天上午 9 点设置闹钟。此外,您可能需要在设备重新启动或启动时重新设置警报,因为一旦设备断电或重新启动,所有警报都会被取消。
Calendar calendar = Calendar.getInstance()
// set selected time from timepicker to calendar
calendar.setTimeInMillis(System.currentTimeMillis());
// if it's after or equal 9 am schedule for next day
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 9) {
Log.e("", "Alarm will schedule for next day!");
calendar.add(Calendar.DAY_OF_YEAR, 1); // add, not set!
}
else{
Log.e("", "Alarm will schedule for today!");
}
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
关于android - AlarmManager setEexact() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49423325/
我想在每次触发 AlarmManager 时额外更改 Intent。这可能吗,我如何在 AlarmManager 触发后立即调用它? 代码: public void startCollector(){
public class AlarmManagerClass extends BroadcastReceiver { public static boolean haveInternet
我正在寻找执行简单任务的最有效方法。作为一名新的 android 开发人员,我不太确定这些策略中的哪一个在内存效率方面最适合我的应用程序。我想其中一些方法可能会导致我不知道的线程问题。 所有三个解决方
我的应用程序有一个实时模块,它应该每 60 秒 ping 服务器一次。否则,连接将断开,设备将需要重新连接。 第一次尝试是使用 Thread.Sleep 使 ping 线程以所需的频率运行。第二次尝试
我有一组在重启后需要保留的警报。我试过在启动接收器上使用,但它们不会重新启动。我不确定我是否了解启动接收器以及如何重新启动所有警报。我已经有一个接收器来接收我的通知,但不知道我是否可以使用同一个接收器
我有一个要在其中创建警报的 Android 应用程序。这是一个正常的闹钟,应该在指定的时间叫醒你。与任何警报一样,您还可以通过在创建警报时选择声音文件来指定它将使用哪种警报声音。 闹钟效果很好,它在正
我的任务是定期读取后端的手机传感器(例如 WiFi、加速度计)。 我目前的解决方案是使用 AlarmManager。 具体来说,我们有: 在“主”程序(一个 Activity )中,我们使用 Pend
public void SetAlarm(Context context, int sec) { AlarmManager am=(AlarmManager)context.getSyst
我已经通过警报管理器制作了简单的警报,问题是当插入很多秒时,它无法及时工作,这是我在这里声明的 这是代码 mo = ((Integer.parseInt(mons.getText().toStrin
我在应用程序中设置了一个闹钟,每 X 分钟触发一次通知。第一次有效,但随后就不重复了。 我正在开发的 API 是 API 18 (Android 4.3)。 MainActivity.class pu
我很难专心于对 AlarmManager 进行编程。 下面的代码几乎只是将当前日期分配给文本字段并获取一些 XML 并使用 setListAdapter 显示它。我希望这段代码在启动时运行,然后每 3
我对如何停止 AlarmManager 有疑问。我想在“x”小时开始并在“y”小时停止,由用户设置。我知道“.cancel”功能的存在,但不知道如何设置“y”小时内的停止时间。 创建时 final E
我的应用程序有一个 AlarmManager 设置为每 60 秒触发一次。它会触发一个 fragment ,该 fragment 检查当前时间并查找应用程序日历中当时是否有任何事件发生。它运行得很好,
我正在尝试安排使用 AlarmManager 调用的方法,但它似乎不起作用。我看过其他例子,但他们的例子不适合我。所以我认为这是我的代码中的一些内容。这是 AlarmManager 代码: Alarm
我将 AlarmManager 设置如下: Intent startIntent = new Intent(context, MyService.class); PendingIntent pend
我正在尝试使用警报管理器发出警报。应用程序运行时没有任何错误消息,但没有任何反应。 我尝试了来自developer.android.com的解决方案和来自stackoverflow的建议。我也尝试复制
public class background_alarm extends BroadcastReceiver { @Override public void onReceive(Context co
我编写了一个每天凌晨 5:22 运行的闹钟代码。该代码在第一个时间间隔内运行良好,但在第二个时间间隔内会在 24 小时之前触发。 我在 MainActivity 的 onCreate() 方法中添加了
我在这些类(class)中有两个类(class),A,B。他们两个我都有一个像下一个这样的警报管理器; class A{ PendingIntent sender; AlarmManager am
我在 9:00 和 21:00 有两个 AlarmManager,但只运行第二个闹钟。 ////////9:00am///////// Intent aviso = new Inten
我是一名优秀的程序员,十分优秀!