各位好,又几天没见了,我是一个Android菜鸟,这几天项目要做个定时提醒业务,在网上看了很多资料,大多数都是关于AlarmManager去实现(虽然我个人觉得用它去实现不够强大,和健壮,但是没办法,短时间内我找不到更好的办法,毕竟开发工作才2个月不到,Android开发的朋友如果有更好的方法请告诉我),这几天由于事前很多,没写博客对学的东西进行总结,每天下来都是空空的,感觉没学到什么东西,很是恐慌。今天特意抽出时间来总结下。
一.首先我们先对AlarmManager讲解下
AlarmManager这个类实现系统警告服务,可以设定一个时间来完成指定的事情,只要在程序中设置了警报服务,就可以通过调用onReceive()方法执行你要做的事情,即使是待机状态,也不会影响运行。可以通过Context.getSystemService()方法来获得该服务。
代码如下:
AlarmManager mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
1.公共方法
取消报警
public void set (int type, long triggerAtTime, PendingIntent operation)
设置警报
设置不精准重复周期
不精准重复周期:有很多类似的警报,类型范围比较大的时候,这些警报就会合并为一个警报,这样可以不用每次都执行警报,是一种节能型
参数的意思
设置精准重复周期
这里有四个参数
第一个参数:即警报的类型,一般取值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP,如果为RTC表示为一个正常的定时器,如果是RTC_WAKEUP则除了有定时器外还可以有震动或者响铃。另外就是RTC在手机睡眠的时候不发射警报,而RTC_WAKEUP则在睡眠的时候也会发射警报
第二个参数:第一次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。例如:现在7点,你设置8点提醒,那么就是7点到8点的时差
第三个参数:表示执行的时间间隔,单位是毫秒,也就是每过多久发射一次警报,一般都是以天为单位
第四个参数:一个PendingIntent对象,即到时间后要执行的操作
设置系统时间,需要权限(android.permission.SET_TIME)
public void setTimeZone (String timeZone)
设置系统默认时区,需要权限(android.permission.SET_TIME_ZONE)
2.Type
AlarmManager.RTC 硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP 硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME 真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP 真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
3.PendingIntent 对象
在使用AlarmManager时一般都会用到PendingIntent,所以在这里进行扩展
PendingIntent与Intent和相似,Intent是意图的意思,想要做什么,而PendingIntent相对于它来说,就是计划将要做什么
代码和类的结构:
1.新建两个类,一个继承Activity,一个继承broadcastReceiver
代码详细:
布局文件
package com.example.Alarm;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
import java.util.TimeZone;
public class MyActivity extends Activity implements TimePicker.OnTimeChangedListener,View.OnClickListener{
private TimePicker mTimePicker;
private Button mButton;
private Button close_Button;
private int mHour = -1;
private int mMinute = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化
initView();
// 获取当前时间
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
if(mHour == -1 && mMinute == -1) {
mHour = calendar.get(Calendar.HOUR_OF_DAY);
mMinute = calendar.get(Calendar.MINUTE);
}
mTimePicker.setCurrentHour(mHour);
mTimePicker.setCurrentMinute(mMinute);
mTimePicker.setOnTimeChangedListener(this);
mButton.setOnClickListener(this);
close_Button.setOnClickListener(this);
}
private void initView(){
mTimePicker = (TimePicker)findViewById(R.id.timePicker);
mButton = (Button)findViewById(R.id.repeating_button);
close_Button= (Button) findViewById(R.id.close_button);
}
@Override
public void onTimeChanged( TimePicker timePicker, int hour, int minute) {
mHour = hour;
mMinute = minute;
}
private PendingIntent sender;
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.repeating_button:
Intent intent = new Intent(MyActivity.this, AlarmBroadcastReceiver.class);
sender = PendingIntent.getBroadcast(MyActivity.this, 0, intent, 0);
long firstTime = SystemClock.elapsedRealtime(); // 开机之后到现在的运行时间(包括睡眠时间)
long systemTime = System.currentTimeMillis(); //当前时间点
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 设置时区,避免时区误差
calendar.set(Calendar.MINUTE, mMinute);
calendar.set(Calendar.HOUR_OF_DAY, mHour);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 选择的每天定时时间
long selectTime = calendar.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if(systemTime > selectTime) {
Toast.makeText(MyActivity.this, "设置的时间小于当前时间", Toast.LENGTH_SHORT).show();
calendar.add(Calendar.DAY_OF_MONTH, 1);
selectTime = calendar.getTimeInMillis();
}
// 计算现在时间到设定时间的时间差
long time = selectTime - systemTime;
firstTime += time;
// 进行闹铃注册
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
5000, 24*60*60*1000,sender);
Toast.makeText(MyActivity.this, "设置重复闹铃成功! ", Toast.LENGTH_LONG).show();
break;
case R.id.close_button:
close();
break;
}
}
public void close(){
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.cancel(sender);
Toast.makeText(this,"关闭成功",Toast.LENGTH_LONG).show();
}
}
broadcast代码
package com.example.Alarm;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//我这里只是提醒,当然你可以做自己想要做的事
Toast.makeText(context, "你设置的时间到了", Toast.LENGTH_LONG).show();
}
}
(学习就是一个分享与探讨,大家一起努力)