Android定时进行消息通知到通知栏
要实现本地定时通知最主要的是要用到系统的闹钟管理器AlarmManager来定时发送一条广播,使用NotificationManager类来写显示在通知栏的信息。
AlarmManager:定时唤醒系统执行任务,即使系统处于深度睡眠也能唤醒。
AlarmManager的使用步骤:
- 获得ALarmManager实例
- 定义一个PendingIntent发出广播
- 调用ALarmManager方法,设置定时或重复提醒
- 取消提醒
发送通知步骤:
- 获取状态栏通知管理NotificationManager
- 配置Notification.Builder
- 绑定Notification,发送通知请求。
注意:要使得APP能在Android8.0中显示通知,需要进行版本判断,然后给builder设置Channel。
具体实现如下:
首先通过AlarmManager进行定时,在指定时间发送一条广播
//获取到AlarmManager对象
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
long firstTime = SystemClock.elapsedRealtime(); // 开机之后到现在的运行时间(包括睡眠时间)
Long secondsNextMorning =getSecondsNext(17,46);
Intent intentMorning = new Intent(this, AlarmBroadcastReceiver.class);
intentMorning.setAction("CLOCK_IN");
//获取到PendingIntent的意图对象
PendingIntent piMorning = PendingIntent.getBroadcast(this, 0, intentMorning, PendingIntent.FLAG_UPDATE_CURRENT); //设置事件
manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + secondsNextMorning, piMorning); //提交事件,发送给 广播接收器
//获取当前时间到指定时间点的时间差
private Long getSecondsNext(int hour,int minute) {
long systemTime = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 选择的定时时间
long selectTime = calendar.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if(systemTime > selectTime) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
selectTime = calendar.getTimeInMillis();
}
// 计算设定时间到现在时间的时间差
Long seconds = selectTime-systemTime;
return seconds.longValue();
}
新建一个广播接收者AlarmBroadcastReceiver,注意需要在AndroidManifest.xml里面进行注册
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("CLOCK_IN")) {
//获取状态通知栏管理
NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder= new NotificationCompat.Builder(context);
//对builder进行配置
builder.setContentTitle("上班打卡") //设置通知栏标题
.setContentText("上班打卡") //设置通知栏显示内容
.setPriority(NotificationCompat.PRIORITY_MAX) //设置通知优先级
.setDefaults(DEFAULT_ALL)
.setSmallIcon(R.drawable.ic_launcher)
.setAutoCancel(true); //设置这个标志当用户单击面板就可以将通知取消
Intent mIntent=new Intent(context, MainActivity.class); //绑定intent,点击图标能够进入某activity
PendingIntent mPendingIntent=PendingIntent.getActivity(context, 0, mIntent,PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(mPendingIntent);
manager.notify(0, builder.build()); //绑定Notification,发送通知请求
}
}
}
网友评论