android之定时器AlarmManager

本文介绍如何在Android应用中使用AlarmManager实现一次性或周期性的定时任务。包括设置时间选择器、配置AlarmManager并触发广播接收器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终效果图:

当我们点击定时时,会弹出一个时间选择器,选定好时间之后,系统便可以进行定时了。注意,这里可不是会真的响铃,我们在定时的任务里并没有添加响铃的代码,只是在Logcat中做了个简单的打印。本例子重点在于讲解在android中AlarmManager的使用。

activity的代码:

[java:nogutter] view plain copy print ?
  1. package cn.com.chenzheng_java;
  2. import java.util.Calendar;
  3. import android.app.Activity;
  4. import android.app.AlarmManager;
  5. import android.app.PendingIntent;
  6. import android.app.TimePickerDialog;
  7. import android.app.TimePickerDialog.OnTimeSetListener;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.CheckBox;
  15. import android.widget.CompoundButton;
  16. import android.widget.TimePicker;
  17. import android.widget.CompoundButton.OnCheckedChangeListener;
  18. public class AlarmManagerActivity extends Activity implements OnClickListener,OnTimeSetListener,OnCheckedChangeListener{
  19. Calendar calendar = Calendar.getInstance();// 代表当前时间的日历
  20. Button button1 ;
  21. CheckBox checkBox;
  22. boolean flag = false ;// 是否只执行一次
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.alarm);
  27. button1 = (Button) findViewById(R.id.button_alarm1);
  28. checkBox = (CheckBox) findViewById(R.id.checkBox1_alarm);
  29. checkBox.setOnCheckedChangeListener(this);
  30. button1.setOnClickListener(this);
  31. }
  32. @Override
  33. public void onClick(View v) {
  34. if(v==button1){
  35. calendar.setTimeInMillis(System.currentTimeMillis());
  36. new TimePickerDialog(AlarmManagerActivity.this, this,
  37. calendar.get(Calendar.HOUR_OF_DAY),
  38. calendar.get(Calendar.MINUTE), true).show();
  39. }
  40. }
  41. /**
  42. * 当我们设置了新时间时触发。
  43. */
  44. @Override
  45. public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
  46. // 将时间设置为定时的时间
  47. calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
  48. calendar.set(Calendar.MINUTE, minute);
  49. Intent intent = new Intent(AlarmManagerActivity.this,MyAlarmBroadCast.class);
  50. PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
  51. /***
  52. * 获取全局定时器的服务管理器
  53. */
  54. AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
  55. if(flag){
  56. /**
  57. * 指定的任务只会执行一次,如果该pendingIntent指定的任务已经被执行过了,那么该方法直接会被cancel掉。
  58. * set(int type, long triggerAtTime, PendingIntent operation)
  59. * type 指定定时模式。
  60. * triggerAtTime 触发任务的时间。该参数和定时模式息息相关
  61. * operation 该参数指定一个广播Intent,当时间到了时,系统会广播里面的intent,触发相应的广播接收者执行某些操作,比如响铃……
  62. */
  63. alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
  64. }
  65. else
  66. {
  67. /**
  68. * 通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔
  69. * 如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent);
  70. * 注意,这里的pendingIntent要和setRepeating方法中的一致哦。
  71. */
  72. alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);
  73. }
  74. Log.i("通知", "定时成功!");
  75. }
  76. @Override
  77. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  78. flag = !isChecked;
  79. }
  80. }

alarm.xml

[xhtml:nogutter] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent" android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <AnalogClock android:id="@+id/analogClock1_alarm"
  6. android:layout_width="wrap_content" android:layout_height="wrap_content"></AnalogClock>
  7. <CheckBox android:text="是否重复响铃" android:id="@+id/checkBox1_alarm" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
  8. <Button android:text="定时" android:id="@+id/button_alarm1"
  9. android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
  10. </LinearLayout>

MyAlarmBroadCast.java

[java:nogutter] view plain copy print ?
  1. package cn.com.chenzheng_java;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.util.Log;
  6. import android.widget.Toast;
  7. /**
  8. * 声明接受AlarmManager时间到了时发布的广播
  9. * @author chenzheng_java
  10. */
  11. public class MyAlarmBroadCast extends BroadcastReceiver{
  12. @Override
  13. public void onReceive(Context context, Intent intent) {
  14. Log.i("通知", "收到了广播");
  15. // 可以在此处添加响铃的代码
  16. }
  17. }

Manifest.xml代码:

[xhtml:nogutter] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="cn.com.chenzheng_java"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdk android:minSdkVersion="8" />
  7. <application android:icon="@drawable/icon" android:label="@string/app_name">
  8. <activity android:name="AlarmManagerActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. <receiver android:name="MyAlarmBroadCast"/>
  16. </application>
  17. </manifest>

------------------------------------------------------------------

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作

使用的步骤:

第一:获取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);

第二:通过AlarmManager的set和setRepeating方法定时。可以通过cancel()方法取消定时。

在set和setRepeating方法中,第一个参数type代表定时模式,这里的定时模式主要有以下几种。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值