zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

Android 历史 广播
2023-09-14 09:03:13 时间
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();

1228 mBroadcastHistory[mHistoryNext] = r;

1229 mHistoryNext = ringAdvance(mHistoryNext, 1, MAX_BROADCAST_HISTORY);

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 Service全屏广播 产品需要一个全屏广播,不管用户在那个界面每隔一段时间都会弹出一个滚动的文字,而且这个不是用推送来做的,后台返回一组数据,然后客户端自己进行处理!如果有更好的方法或者建议都可以跟我说一下,万分感谢,第一次做这个也不知道用什么合适!
一:普通广播 普通广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条消息,他们接收的先后是随机的。
终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 1. 简介 通常我们在使用Android广播的时候都会直接将广播注册到系统的AMS当中,由于AMS任务繁忙,一般可能不会立即能处理到我们发出的广播,如果我们使用广播是在应用内的单个进程中使用,则完全可以采用LocalBroadcastManager来处理。
lusing 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。