说说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 enqueuedlong dispatchTime;      // when dispatch started on this set of receiverslong dispatchClockTime; // the clock time the dispatch startedlong 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();12271228        mBroadcastHistory[mHistoryNext] = r;1229        mHistoryNext = ringAdvance(mHistoryNext, 1, MAX_BROADCAST_HISTORY);12301231        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的时候,会把这些都串起来。

更多相关文章

  1. Android使用Broadcast实现无序静态与动态广播功能
  2. Android(安卓)Gradle 更新到 3.4.1 问题记录
  3. Android中的广播机制(二)----- 发送广播
  4. Android(安卓)-- Broadcast接收
  5. 这是一篇描述 Broadcasts 的文章
  6. 五种方式实现Android底部导航栏
  7. Android(安卓)ListView拖动一条记录时,整体背景全黑的问题
  8. 【微信 video】微信 video 踩坑记录
  9. BAT大咖助力Android面试4-Broadcast面试详解

随机推荐

  1. Android深入浅出之Audio(1,2,3)
  2. Android(安卓)开发环境搭建
  3. ANDROID导入文件后的本地无法编译生成R.j
  4. Android事件分发机制完全解析
  5. Android中ListView 控件与 Adapter 适配
  6. Android 横竖屏操作
  7. Android(安卓)适配toolbar后windowSoftIn
  8. Android(安卓)studio 生成的fragment_mai
  9. android 使用intent传递参数实现乘法计算
  10. android嵌套滑动- Material Design