关于AlarmManager的问题

本文介绍了一个简单的定时提醒功能实现方案,包括使用AlarmManager设置提醒时间、通过BroadcastReceiver接收提醒并重新计算下一个提醒时间等关键步骤。

先说下需求吧, 这个是服务器端设定几个时间段,比如说 周一,周三 的下午15点。 然后让用户来勾选。如果用户选择了这个时间段,那么每个周一,周三的下午15点都给用户一个提醒。

目前我是这样解决的

1:新建一个Alarms的类 主要功能是来设置提醒的时间,内容如下:

public class Alarms {
	//xml 里面的设置
	private static final String BC_ACTION = "com.example.myalarmtest.action.BC_ACTION";
	
	public static void startAlarm(Context context,long time){

		final AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
		Intent intent = new Intent();
		intent.setAction(BC_ACTION);
		intent.putExtra("msg", "next alarm");
		final PendingIntent pi = PendingIntent.getBroadcast(context,0,intent,0);
		am.set(AlarmManager.RTC, time, pi);
	}
}
2:主activity里面调用这方法 5秒之后提醒

	private void startAlarm(){
	    Calendar calendar=Calendar.getInstance();
	    calendar.setTimeInMillis(System.currentTimeMillis());
	    calendar.add(Calendar.SECOND, 5);
		long time = calendar.getTimeInMillis();
		Alarms.startAlarm(MainActivity.this,time);
	}

3:新建一个MyReceiver的类,继承 BroadcastReceiver 主要作用是 servers 用来通知或者提醒。

public class MyReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String msg = intent.getStringExtra("msg");
		Toast.makeText(context, msg+"sssss", Toast.LENGTH_LONG).show();
		
		//计算出来下一次的时间 time 
	    Calendar calendar=Calendar.getInstance();
	    calendar.setTimeInMillis(System.currentTimeMillis());
	    calendar.add(Calendar.SECOND, 5);
		long time = calendar.getTimeInMillis();
		Alarms.startAlarm(context,time);
	}

}

4:这是xml注册内容

        <receiver
            android:name="MyReceiver">
            <intent-filter>
                <action android:name="com.example.myalarmtest.action.BC_ACTION"/>
            </intent-filter> 
        </receiver>

具体的时间计算方法 没写出来。大家可以自己来计算
### 使用 Android AlarmManager 的概述 `AlarmManager` 是 Android 提供的一个系统服务,用于调度设备上的定时任务。它允许开发者在特定时间触发某些操作,即使应用已经关闭或者设备处于休眠状态。然而,需要注意的是 `AlarmManager` 并不适合所有的场景[^1]。 #### 创建和设置 AlarmManager 实例 要使用 `AlarmManager`,首先需要通过系统的上下文获取其实例: ```java AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); ``` 接着定义一个待执行的操作,通常会封装在一个 `PendingIntent` 中。以下是创建广播接收器的示例代码: ```java Intent intent = new Intent(context, YourBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); ``` 注意:从 Android 12 开始,必须指定 `FLAG_IMMUTABLE` 或者 `FLAG_MUTABLE` 来声明 `PendingIntent` 是否可以被修改[^2]。 #### 设置一次性闹钟 如果希望某个事件只发生一次,则可以通过如下方式实现: ```java long triggerTimeMillis = System.currentTimeMillis() + 5 * 60 * 1000; // 延迟五分钟 alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTimeMillis, pendingIntent); ``` 这里选择了 `RTC_WAKEUP` 类型,表示无论设备是否进入睡眠模式都会唤醒并触发该意图。 #### 定期重复的任务 对于周期性的任务处理,可以选择不同的方法来满足需求。例如精确间隔的时间表适合采用以下形式之一: ```java // 设定每十分钟提醒一次 alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 60 * 1000L /* 十分钟 */, pendingIntent ); ``` 但是要注意,在现代版本的 Android 上(特别是 Doze Mode 和 App Standby 下),频繁的小间隔报警可能不会按照预期那样准时到达[^1]。 #### 取消已注册的警报 任何时候都可以调用下面的方法停止之前设定好的任何类型的警报: ```java if(alarmManager != null){ alarmManager.cancel(pendingIntent); } pendingIntent.cancel(); ``` 这一步非常重要,尤其是在用户主动退出程序之后不再需要继续运行后台逻辑的情况下应该及时清理资源以节省电量消耗[^2]。 --- ### 关于 Wake Locks 的注意事项 长时间持有部分唤醒锁可能会导致电池快速耗尽等问题,因此务必谨慎管理它们的生命週期。除非绝对必要,否则尽量避免长期保持屏幕亮起或者其他高能耗行为[^2]。 ### 性能优化建议 由于能源效率方面的考量,推荐优先考虑其他更适合当前业务模型的技术方案比如 JobScheduler/WorkManager 结合 FCM 推送消息机制完成即时通讯类功能开发工作而不是单纯依赖传统的 AlarmManager 构建复杂的应用架构设计思路[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值