Android之AlarmManager

AlarmManager 定时周期不精确

使用AlarmManager启动循环任务,代码如下

almgr = (AlarmManager)getSystemService(ALARM_SERVICE);
        Intent intent = new Intent(tag);
        pi = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        almgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 2000, pi);

定时周期是2000 ms,但是实际测试结果,receiver接受到的周期是1 min左右

12-10 16:13:52.882 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:14:52.881 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:15:52.880 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:16:52.881 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:17:52.881 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:18:52.880 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive
12-10 16:19:52.881 24628-24628/com.example.tg.testalarmmanager D/MainService: onReceive

Note: Beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use. There are new APIs to support applications which need strict delivery guarantees; see setWindow(int, long, long, PendingIntent) and setExact(int, long, PendingIntent). Applications whose targetSdkVersion is earlier than API 19 will continue to see the previous behavior in which all alarms are delivered exactly when requested.

参考
API 19开始,使用Alarm.set()和Alarm.setRepeating()已经不保证精确性。

AlarmManager triger time设置成过去的时间,当set之后,会立即触发该事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AndroidAlarmManager是一个用于定时任务的类,可以用来在特定时间触发一些操作,比如发送通知、执行某个程序等等。 一个简单的AlarmManager的示例可以是设置一个定时任务,在每天的特定时间执行某个操作。 首先,我们需要在AndroidManifest.xml文件中添加权限: <uses-permission android:name="android.permission.SET_ALARM" /> 接下来,我们可以在一个Activity或者Service中编写如下代码: ```java import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; public class AlarmManagerDemo { public static void setAlarm(Context context) { // 获取AlarmManager实例 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // 创建Intent,指定触发广播的Action Intent intent = new Intent(context, AlarmReceiver.class); intent.setAction("com.example.alarmdemo.ALARM_TRIGGERED"); // 创建PendingIntent,用于触发广播 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // 设置定时任务,每天的特定时间触发 long triggerTime = ...; // 设定触发时间,可以是一天的特定时间,比如早上8点 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, AlarmManager.INTERVAL_DAY, pendingIntent); } public static void cancelAlarm(Context context) { // 获取AlarmManager实例 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // 创建Intent,指定触发广播的Action Intent intent = new Intent(context, AlarmReceiver.class); intent.setAction("com.example.alarmdemo.ALARM_TRIGGERED"); // 创建PendingIntent,用于触发广播 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // 取消定时任务 alarmManager.cancel(pendingIntent); } } ``` 以上代码中,setAlarm()方法用于设置定时任务,cancelAlarm()方法用于取消定时任务。我们需要创建一个BroadcastReceiver类AlarmReceiver,用来接收定时任务触发的广播,并执行相应操作。 这只是一个简单的AlarmManager示例,你可以根据自己的需求修改代码,实现更复杂的定时任务。 ### 回答2: Android中的AlarmManager是一个用于在指定时间间隔和时间点触发操作的类。它可以被用来定时执行某个任务、发送通知、或执行其他需要在特定时间发生的操作。下面是一个关于Android AlarmManager的简单演示: 首先,我们需要在AndroidManifest.xml文件中添加权限: ``` <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> ``` 然后,在MainActivity中创建AlarmManager对象和一个用于触发的PendingIntent对象: ``` AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); ``` 接下来,可以使用下面的代码来设置一个简单的定时任务,比如每隔5秒触发一次: ``` Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND, 5); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5000, pendingIntent); ``` 这个意味着在当前时间的5秒后开始触发定时任务,并且每隔5秒再次触发。 最后,我们需要创建一个AlarmReceiver类来处理定时任务的触发事件。可以通过继承BroadcastReceiver类来实现,然后重写onReceive方法: ``` public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 在这里可以执行你想要的操作,比如发送通知或执行任务 } } ``` 以上就是一个简单的Android AlarmManager的演示,通过设置定时任务来在指定时间间隔或时间点执行操作。可以根据实际需求来定制定时任务的触发时间和操作。 ### 回答3: Android AlarmManagerAndroid系统提供的一种用于管理定时任务的工具类。通过AlarmManager,我们可以实现在指定时间触发某个操作,比如发送通知、启动服务等。 下面是一个简单的Android AlarmManager示例: 1. 首先,需要在AndroidManifest.xml文件中添加权限: ```xml <uses-permission android:name="android.permission.SET_ALARM"/> ``` 2. 在MainActivity.java文件中,创建一个使用AlarmManager的示例: ```java import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import java.util.Calendar; public class MainActivity extends AppCompatActivity { private AlarmManager alarmManager; private PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取AlarmManager实例 alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); // 创建一个Intent,用于触发定时操作 Intent intent = new Intent(this, MyReceiver.class); pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 设置定时任务,这里设置的是每天早上8点触发 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); } } ``` 3. 创建一个广播接收器MyReceiver.java,在onReceive()方法中定义定时任务触发后的操作: ```java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 定时任务触发后的操作,这里简单地弹出一个Toast提示 Toast.makeText(context, "定时任务触发了", Toast.LENGTH_SHORT).show(); } } ``` 以上就是一个简单的Android AlarmManager的示例。通过AlarmManager,我们可以方便地实现定时任务的管理和触发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值