教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

Android原生模块DeskClock分析1(6)

来源:网络收集 时间:2026-07-05
导读: DeskClock分析文档 ? AlarmReceiver类继承BroadcastReceiver,该类重写onReceive()方法,定义 了NotificationManager()和updateNotification()。 ? onReceive()方法接受系统发来的广播 @Override public vo

DeskClock分析文档

? AlarmReceiver类继承BroadcastReceiver,该类重写onReceive()方法,定义

了NotificationManager()和updateNotification()。 ?

onReceive()方法接受系统发来的广播

@Override

public void onReceive(Context context, Intent intent) { //杀死闹铃

if (Alarms.ALARM_KILLED.equals(intent.getAction())) {Log.e(\

// The alarm has been killed, update the notification updateNotification(context, (Alarm) //手动杀死

intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA),

//超时杀死

intent.getIntExtra(Alarms.ALARM_KILLED_TIMEOUT, -1)); return;

} else if (Alarms.CANCEL_SNOOZE.equals(intent.getAction())) { Log.e(\

Alarms.saveSnoozeAlert(context, -1, -1); return; }

Alarm alarm = null; //

final byte[] data =

intent.getByteArrayExtra(Alarms.ALARM_RAW_DATA); if (data != null) {Log.e(\ Parcel in = Parcel.obtain();

in.unmarshall(data, 0, data.length); in.setDataPosition(0);

alarm = Alarm.CREATOR.createFromParcel(in); }

if (alarm == null) {Log.e(\

Log.v(\intent\

return; }

// Intentionally verbose: always log the alarm time to provide useful

// information in bug reports.

16

DeskClock分析文档

long now = System.currentTimeMillis(); SimpleDateFormat format =

new SimpleDateFormat(\

Log.v(\ + format.format(new Date(alarm.time)));

if (now > alarm.time + STALE_WINDOW * 1000) {Log.e(\ if (Log.LOGV) {

Log.v(\ } return; }

// 保证cpu唤醒前,通过AlarmAlertWakeLock和AlarmAlert将 AlarmAlertWakeLock.acquireCpuWakeLock(context);

/* Close dialogs and window shade */ Intent closeDialogs = new

Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); context.sendBroadcast(closeDialogs);

//决定哪些活动开始基于keyguard的状态. Class c = AlarmAlert.class;

KeyguardManager km = (KeyguardManager) context.getSystemService( Context.KEYGUARD_SERVICE);Log.e(\ if (km.inKeyguardRestrictedInputMode()) {Log.e(\

// 使用全屏活动以保证安全.

c = AlarmAlertFullScreen.class; }

/* launch UI, explicitly stating that this is not due to user action * so that the current app's notification management is not disturbed */

Intent alarmAlert = new Intent(context, c);

alarmAlert.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm); alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION); context.startActivity(alarmAlert);

// 如果snooze,禁用.

Alarms.disableSnoozeAlert(context, alarm.id); // 如果没有重复,禁用

17

DeskClock分析文档

if (!alarm.daysOfWeek.isRepeatSet()) {Log.e(\ Alarms.enableAlarm(context, alarm.id, false); } else {Log.e(\

//如果有下一个警报。enableAlarm通知setNextAler,避免调用它的两次. Alarms.setNextAlert(context); }

// 启用闹铃和震动装置.

Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION); playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm); context.startService(playAlarm);

Intent notify = new Intent(context, AlarmAlert.class); notify.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);

PendingIntent pendingNotify = PendingIntent.getActivity(context, alarm.id, notify, 0);

String label = alarm.getLabelOrDefault(context); Log.e(\

Notification n = new Notification(R.drawable.stat_notify_alarm, label, alarm.time);

n.setLatestEventInfo(context, label,

context.getString(R.string.alarm_notify_text), pendingNotify);

n.flags |= Notification.FLAG_SHOW_LIGHTS | Notification.FLAG_ONGOING_EVENT; n.defaults |= Notification.DEFAULT_LIGHTS;

NotificationManager nm = getNotificationManager(context); nm.notify(alarm.id, n);

}

? updateNotification()方法更新消息 private void updateNotification(Context context, Alarm alarm, int timeout) {

NotificationManager nm = getNotificationManager(context);

// If the alarm is null, just cancel the notification. if (alarm == null) {

if (Log.LOGV) {Log.e(\

18

DeskClock分析文档

Log.v(\ } return; }

// 当点击,发出SetAlarm.

Intent viewAlarm = new Intent(context, SetAlarm.class); viewAlarm.putExtra(Alarms.ALARM_ID, alarm.id); PendingIntent intent =

PendingIntent.getActivity(context, alarm.id, viewAlarm, 0);

//更新通知显示警报已经消失.

String label = alarm.getLabelOrDefault(context); Log.e(\

Notification n = new Notification(R.drawable.stat_notify_alarm, label, alarm.time);

n.setLatestEventInfo(context, label,

context.getString(R.string.alarm_alert_alert_silenced, timeout),

intent);

n.flags |= Notification.FLAG_A …… 此处隐藏:2540字,全部文档内容请下载后查看。喜欢就下载吧 ……

Android原生模块DeskClock分析1(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/520580.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)