说说Android的广播(5) - 广播的历史

简介: 处理完广播之后,BroadcastQueue会记录一段历史用于调试

说说Android的广播(5) - 广播的历史

广播的历史

AMS中的历史信息

处理完广播之后,BroadcastQueue会记录一段历史用于调试:

  • mBroadcastHistory记录最近的BroadcastRecord
  • mBroadcastSummaryHistory记录最近的Intent
  • mSummaryHistoryEnqueueTime记录最近的enqueueTime
  • mSummaryHistoryDispatchTime记录最近的dispatchTime
  • mSummaryHistoryFinishTime记录最近的finishTime

具体的定义如下:

/**
 * Historical data of past broadcasts, for debugging.  This is a ring buffer
 * whose last element is at mHistoryNext.
 */
final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY];
int mHistoryNext = 0;

/**
 * Summary of historical data of past broadcasts, for debugging.  This is a
 * ring buffer whose last element is at mSummaryHistoryNext.
 */
final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
int mSummaryHistoryNext = 0;

/**
 * Various milestone timestamps of entries in the mBroadcastSummaryHistory ring
 * buffer, also tracked via the mSummaryHistoryNext index.  These are all in wall
 * clock time, not elapsed.
 */
final long[] mSummaryHistoryEnqueueTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];
final long[] mSummaryHistoryDispatchTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];
final long[] mSummaryHistoryFinishTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];

BroadcastRecord中的历史信息

BroadcastRecord中,除了前面我们讲的这几个时间:

long enqueueClockTime;  // the clock time the broadcast was enqueued
long dispatchTime;      // when dispatch started on this set of receivers
long dispatchClockTime; // the clock time the dispatch started
long receiverTime;      // when current receiver started for timeouts.
long finishTime;        // when we finished the broadcast.

还有记录的ANR的次数:

int anrCount;           // has this broadcast record hit any ANRs?

可惜这两部分信息只是被打日志调试时用到。

BroadcastQueue中记录历史的过程

BroadcastQueue中提供了addBroadcastToHistoryLocked方法来记录历史信息。

1221    private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
1222        if (r.callingUid < 0) {
1223            // This was from a registerReceiver() call; ignore it.
1224            return;
1225        }
1226        r.finishTime = SystemClock.uptimeMillis();
1227
1228        mBroadcastHistory[mHistoryNext] = r;
1229        mHistoryNext = ringAdvance(mHistoryNext, 1, MAX_BROADCAST_HISTORY);
1230
1231        mBroadcastSummaryHistory[mSummaryHistoryNext] = r.intent;
1232        mSummaryHistoryEnqueueTime[mSummaryHistoryNext] = r.enqueueClockTime;
1233        mSummaryHistoryDispatchTime[mSummaryHistoryNext] = r.dispatchClockTime;
1234        mSummaryHistoryFinishTime[mSummaryHistoryNext] = System.currentTimeMillis();
1235        mSummaryHistoryNext = ringAdvance(mSummaryHistoryNext, 1, MAX_BROADCAST_SUMMARY_HISTORY);
1236    }

其中,ringAdvance的实现是这样的。从循环计数的角度来讲,Android这段写得并不好。只在increment为+1或者-1的情况下还算工作正常吧。

1214    private final int ringAdvance(int x, final int increment, final int ringSize) {
1215        x += increment;
1216        if (x < 0) return (ringSize - 1);
1217        else if (x >= ringSize) return 0;
1218        else return x;
1219    }

addBroadcastToHistoryLocked一共被调用两次,全部都在processNextBroadcast函数中。一处是在并发队列处理完之后,另一个是在有序队列返回值以后。下节我们分析processNextBroadcast的时候,会把这些都串起来。

目录
相关文章
|
物联网 Android开发
Android 解析蓝牙广播数据
Android 解析蓝牙广播数据
1153 1
Android 解析蓝牙广播数据
|
存储 消息中间件 Android开发
Android源码分析--广播的注册、发送和接收
Android源码分析--广播的注册、发送和接收
295 0
Android源码分析--广播的注册、发送和接收
|
消息中间件 存储 Android开发
Android 四大组件之一:BroadCastReceiver动态注册广播流程
Android 四大组件之一:BroadCastReceiver动态注册广播流程
288 0
Android 四大组件之一:BroadCastReceiver动态注册广播流程
|
设计模式 Android开发
Android移动应用基础教程【广播机制】
Android移动应用基础教程【广播机制】
246 0
Android移动应用基础教程【广播机制】
|
Android开发
Android Service全屏广播
场景 产品需要一个全屏广播,不管用户在那个界面每隔一段时间都会弹出一个滚动的文字,而且这个不是用推送来做的,后台返回一组数据,然后客户端自己进行处理!如果有更好的方法或者建议都可以跟我说一下,万分感谢,第一次做这个也不知道用什么合适!
212 0
|
API Android开发 UED
【Android 进程保活】应用进程拉活 ( 应用进程拉活简介 | 广播拉活 | 显示广播与隐式广播 | 全家桶拉活 )
【Android 进程保活】应用进程拉活 ( 应用进程拉活简介 | 广播拉活 | 显示广播与隐式广播 | 全家桶拉活 )
432 0
|
Java Android开发 开发者
【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
219 0
|
缓存 Android开发
【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
515 0
|
Android开发
我要做 Android 之 广播
广播的分类: 普通广播 有序广播 本地广播 粘性广播 一:普通广播 普通广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条消息,他们接收的先后是随机的。
1306 0