美文网首页
Android使用AlarmManager实现定时推送功能

Android使用AlarmManager实现定时推送功能

作者: YX_亚亚呀 | 来源:发表于2019-11-06 10:13 被阅读0次

Android定时进行消息通知到通知栏

要实现本地定时通知最主要的是要用到系统的闹钟管理器AlarmManager来定时发送一条广播,使用NotificationManager类来写显示在通知栏的信息。

AlarmManager:定时唤醒系统执行任务,即使系统处于深度睡眠也能唤醒。
AlarmManager的使用步骤:

  1. 获得ALarmManager实例
  2. 定义一个PendingIntent发出广播
  3. 调用ALarmManager方法,设置定时或重复提醒
  4. 取消提醒

发送通知步骤:

  1. 获取状态栏通知管理NotificationManager
  2. 配置Notification.Builder
  3. 绑定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,发送通知请求
       }
    }

}

相关文章

网友评论

      本文标题:Android使用AlarmManager实现定时推送功能

      本文链接:https://www.haomeiwen.com/subject/nqhdbctx.html