android之定时器AlarmManager

来源:互联网 发布:沙发的意思网络词语 编辑:程序博客网 时间:2024/06/04 18:18
终效果图:

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

activity的代码:

[java:nogutter] view plaincopyprint?
  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 AlarmManagerActivityextends 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 plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <AnalogClockandroid:id="@+id/analogClock1_alarm"
  6. android:layout_width="wrap_content"android:layout_height="wrap_content"></AnalogClock>
  7. <CheckBoxandroid:text="是否重复响铃"android:id="@+id/checkBox1_alarm"android:layout_width="wrap_content"android:layout_height="wrap_content"></CheckBox>
  8. <Buttonandroid: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 plaincopyprint?
  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 MyAlarmBroadCastextends BroadcastReceiver{
  12. @Override
  13. public void onReceive(Context context, Intent intent) {
  14. Log.i("通知", "收到了广播");
  15. // 可以在此处添加响铃的代码
  16. }
  17. }

Manifest.xml代码:

[xhtml:nogutter] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns: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-sdkandroid:minSdkVersion="8"/>
  7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  8. <activityandroid:name="AlarmManagerActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <actionandroid:name="android.intent.action.MAIN"/>
  12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  13. </intent-filter>
  14. </activity>
  15. <receiverandroid:name="MyAlarmBroadCast"/>
  16. </application>
  17. </manifest>

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

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

使用的步骤:

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

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

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

原创粉丝点击