android之定时器AlarmManager .
16lz
2021-01-24
果图:
当我们点击定时时,会弹出一个时间选择器,选定好时间之后,系统便可以进行定时了。注意,这里可不是会真的响铃,我们在定时的任务里并没有添加响铃的代码,只是在Logcat中做了个简单的打印。本例子重点在于讲解在android中AlarmManager的使用。
activity的代码:
view plain copy to clipboard print ?- packagecn.com.chenzheng_java;
- importjava.util.Calendar;
- importandroid.app.Activity;
- importandroid.app.AlarmManager;
- importandroid.app.PendingIntent;
- importandroid.app.TimePickerDialog;
- importandroid.app.TimePickerDialog.OnTimeSetListener;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.CheckBox;
- importandroid.widget.CompoundButton;
- importandroid.widget.TimePicker;
- importandroid.widget.CompoundButton.OnCheckedChangeListener;
- publicclassAlarmManagerActivityextendsActivityimplementsOnClickListener,OnTimeSetListener,OnCheckedChangeListener{
- Calendarcalendar=Calendar.getInstance();//代表当前时间的日历
- Buttonbutton1;
- CheckBoxcheckBox;
- booleanflag=false;//是否只执行一次
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.alarm);
- button1=(Button)findViewById(R.id.button_alarm1);
- checkBox=(CheckBox)findViewById(R.id.checkBox1_alarm);
- checkBox.setOnCheckedChangeListener(this);
- button1.setOnClickListener(this);
- }
- @Override
- publicvoidonClick(Viewv){
- if(v==button1){
- calendar.setTimeInMillis(System.currentTimeMillis());
- newTimePickerDialog(AlarmManagerActivity.this,this,
- calendar.get(Calendar.HOUR_OF_DAY),
- calendar.get(Calendar.MINUTE),true).show();
- }
- }
- /**
- *当我们设置了新时间时触发。
- */
- @Override
- publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){
- //将时间设置为定时的时间
- calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
- calendar.set(Calendar.MINUTE,minute);
- Intentintent=newIntent(AlarmManagerActivity.this,MyAlarmBroadCast.class);
- PendingIntentpendingIntent=PendingIntent.getBroadcast(getApplicationContext(),0,intent,0);
- /***
- *获取全局定时器的服务管理器
- */
- AlarmManageralarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
- if(flag){
- /**
- *指定的任务只会执行一次,如果该pendingIntent指定的任务已经被执行过了,那么该方法直接会被cancel掉。
- *set(inttype,longtriggerAtTime,PendingIntentoperation)
- *type指定定时模式。
- *triggerAtTime触发任务的时间。该参数和定时模式息息相关
- *operation该参数指定一个广播Intent,当时间到了时,系统会广播里面的intent,触发相应的广播接收者执行某些操作,比如响铃……
- */
- alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
- }
- else
- {
- /**
- *通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔
- *如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent);
- *注意,这里的pendingIntent要和setRepeating方法中的一致哦。
- */
- alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),5*1000,pendingIntent);
- }
- Log.i("通知","定时成功!");
- }
- @Override
- publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
- flag=!isChecked;
- }
- }
alarm.xml
view plain copy to clipboard print ?- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"android:layout_height="match_parent"
- android:orientation="vertical">
- <AnalogClockandroid:id="@+id/analogClock1_alarm"
- android:layout_width="wrap_content"android:layout_height="wrap_content"></AnalogClock>
- <CheckBoxandroid:text="是否重复响铃"android:id="@+id/checkBox1_alarm"android:layout_width="wrap_content"android:layout_height="wrap_content"></CheckBox>
- <Buttonandroid:text="定时"android:id="@+id/button_alarm1"
- android:layout_width="wrap_content"android:layout_height="wrap_content"></Button>
- </LinearLayout>
MyAlarmBroadCast.java
view plain copy to clipboard print ?- packagecn.com.chenzheng_java;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.util.Log;
- importandroid.widget.Toast;
- /**
- *声明接受AlarmManager时间到了时发布的广播
- *@authorchenzheng_java
- */
- publicclassMyAlarmBroadCastextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- Log.i("通知","收到了广播");
- //可以在此处添加响铃的代码
- }
- }
Manifest.xml代码:
view plain copy to clipboard print ?- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.com.chenzheng_java"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="8"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name="AlarmManagerActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <receiverandroid:name="MyAlarmBroadCast"/>
- </application>
- </manifest>
------------------------------------------------------------------
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作
使用的步骤:
第一:获取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);
第二:通过AlarmManager的set和setRepeating方法定时。可以通过cancel()方法取消定时。
在set和setRepeating方法中,第一个参数type代表定时模式,这里的定时模式主要有以下几种。
更多相关文章
- Android之TelephonyManager类的方法详解
- OkHttp在Android中使用详解
- Android(安卓)Handler消息机制
- android 按两次返回键强制退出整个APP
- Android(安卓)ListView一些应该知道的事
- android利用post方式与web服务器通信
- Android存储路径解析
- 深入了解android平台的jni(一)
- Android(安卓)线程 thread 两种实现方法!