Android8.0 AlarmManagerService
来源:互联网 发布:安卓6.0源码编译教程 编辑:程序博客网 时间:2024/05/17 23:57
只是做下笔记
关于闹铃怎么触发的,当你设置好闹铃后,时间到了就会走这里触发。前面的流程不分析。闹铃触发就是发一个广播给你自己的app(alarm.operation.send),然后做处理。你可以显示一个闹钟界面,也可以是service做一些处理。
这里好像有2中形式,看注释。不是很清楚。
PendingIntent alarm
Direct listener callback alarm
Alarm alarm包含了一些信息,比如packagename,等等。
frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
/** * Deliver an alarm and set up the post-delivery handling appropriately */ public void deliverLocked(Alarm alarm, long nowELAPSED, boolean allowWhileIdle) { if (alarm.operation != null) { // PendingIntent alarm try { Log.i("a", "deliverLocked alarm.operation.send ----------"); Log.i("a", ""+alarm); if(alarm.alarmClock!=null) Log.i("a", ""+alarm.alarmClock); Log.i("a", "----------------------"); alarm.operation.send(getContext(), 0, mBackgroundIntent.putExtra( Intent.EXTRA_ALARM_COUNT, alarm.count), mDeliveryTracker, mHandler, null, allowWhileIdle ? mIdleOptions : null); } catch (PendingIntent.CanceledException e) { if (alarm.repeatInterval > 0) { // This IntentSender is no longer valid, but this // is a repeating alarm, so toss it removeImpl(alarm.operation); } // No actual delivery was possible, so the delivery tracker's // 'finished' callback won't be invoked. We also don't need // to do any wakelock or stats tracking, so we have nothing // left to do here but go on to the next thing. return; } } else { if(mNotificationManager.getZenMode()==Global.ZEN_MODE_GAME&&alarm.alarmClock!=null) { return; } // Direct listener callback alarm try { if (DEBUG_LISTENER_CALLBACK) { Slog.v(TAG, "Alarm to uid=" + alarm.uid + " listener=" + alarm.listener.asBinder()); } alarm.listener.doAlarm(this); mHandler.sendMessageDelayed( mHandler.obtainMessage(AlarmHandler.LISTENER_TIMEOUT, alarm.listener.asBinder()), mConstants.LISTENER_TIMEOUT); } catch (Exception e) { if (DEBUG_LISTENER_CALLBACK) { Slog.i(TAG, "Alarm undeliverable to listener " + alarm.listener.asBinder(), e); } // As in the PendingIntent.CanceledException case, delivery of the // alarm was not possible, so we have no wakelock or timeout or // stats management to do. It threw before we posted the delayed // timeout message, so we're done here. return; } } // The alarm is now in flight; now arrange wakelock and stats tracking if (DEBUG_WAKELOCK) { Slog.d(TAG, "mBroadcastRefCount -> " + (mBroadcastRefCount + 1)); } if (mBroadcastRefCount == 0) { setWakelockWorkSource(alarm.operation, alarm.workSource, alarm.type, alarm.statsTag, (alarm.operation == null) ? alarm.uid : -1, true); if (!mWakeLock.isHeld()) { mWakeLock.acquire(); } mHandler.obtainMessage(AlarmHandler.REPORT_ALARMS_ACTIVE, 1).sendToTarget(); } final InFlight inflight = new InFlight(AlarmManagerService.this, alarm.operation, alarm.listener, alarm.workSource, alarm.uid, alarm.packageName, alarm.type, alarm.statsTag, nowELAPSED); mInFlight.add(inflight); mBroadcastRefCount++; qcNsrmExt.addTriggeredUid((alarm.operation != null) ? alarm.operation.getCreatorUid() : alarm.uid); if (allowWhileIdle) { // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. mLastAllowWhileIdleDispatch.put(alarm.uid, nowELAPSED); if (RECORD_DEVICE_IDLE_ALARMS) { IdleDispatchEntry ent = new IdleDispatchEntry(); ent.uid = alarm.uid; ent.pkg = alarm.packageName; ent.tag = alarm.statsTag; ent.op = "DELIVER"; ent.elapsedRealtime = nowELAPSED; mAllowWhileIdleDispatches.add(ent); } } final BroadcastStats bs = inflight.mBroadcastStats; bs.count++; if (bs.nesting == 0) { bs.nesting = 1; bs.startTime = nowELAPSED; } else { bs.nesting++; } final FilterStats fs = inflight.mFilterStats; fs.count++; if (fs.nesting == 0) { fs.nesting = 1; fs.startTime = nowELAPSED; } else { fs.nesting++; } if (alarm.type == ELAPSED_REALTIME_WAKEUP || alarm.type == RTC_WAKEUP) { bs.numWakeup++; fs.numWakeup++; if (alarm.workSource != null && alarm.workSource.size() > 0) { for (int wi=0; wi<alarm.workSource.size(); wi++) { final String wsName = alarm.workSource.getName(wi); ActivityManager.noteWakeupAlarm( alarm.operation, alarm.workSource.get(wi), (wsName != null) ? wsName : alarm.packageName, alarm.statsTag); } } else { ActivityManager.noteWakeupAlarm( alarm.operation, alarm.uid, alarm.packageName, alarm.statsTag); } } } }}
阅读全文
0 0
- Android8.0 AlarmManagerService
- Android8.0
- android8.0编译记录
- Android8.0 Setupwizard 定制
- Android8.0广播使用
- Android8.0 安装apk
- Android8
- Android8.0曝光--新功能简化
- Android8.0“未知来源”安装
- Android8.0 Oreo新特性
- Android8.0 ZenMode 静音模式
- Android8.0 修改默认音量
- Android6.0 设备Idle状态(二)AlarmManagerService setIdleUntil接口
- AlarmManagerService alarmbatch
- Android8.0新系统刷机新尝鲜
- android8.0的vdex文件格式分析
- android8.0/android O 新特性
- Android8.0有关行为变更小结
- “中国已建成世界上最大的视频监控网”背后的问题
- 基于java的URP教务系统爬虫实现
- 三十四、面向对象进阶
- 数据库
- ruby
- Android8.0 AlarmManagerService
- springboot学习笔记(一) Spring boot Hello Word!
- 从零开始自己的架构(1)
- 利用Python创建链接mysql数据库个性化对象
- apache的用户认证
- A+B problem
- Mysql通过load data infile,20秒导入100W数据
- 网络通信
- 今日头条核心技术“个性推荐算法”揭秘