说说Android的广播(5) - 广播的历史
Android 历史 广播
2023-09-14 09:03:13 时间
mBroadcastSummaryHistory记录最近的Intent
mSummaryHistoryEnqueueTime记录最近的enqueueTime
mSummaryHistoryDispatchTime记录最近的dispatchTime
mSummaryHistoryFinishTime记录最近的finishTime
Android Service全屏广播 产品需要一个全屏广播,不管用户在那个界面每隔一段时间都会弹出一个滚动的文字,而且这个不是用推送来做的,后台返回一组数据,然后客户端自己进行处理!如果有更好的方法或者建议都可以跟我说一下,万分感谢,第一次做这个也不知道用什么合适!
一:普通广播 普通广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条消息,他们接收的先后是随机的。
终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 1. 简介 通常我们在使用Android广播的时候都会直接将广播注册到系统的AMS当中,由于AMS任务繁忙,一般可能不会立即能处理到我们发出的广播,如果我们使用广播是在应用内的单个进程中使用,则完全可以采用LocalBroadcastManager来处理。
lusing 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
具体的定义如下:
/** * 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 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
相关文章
- android打包方法超过65k错误
- 《Gradle权威指南》--Android Gradle多渠道构建
- Android 动态创建 Textview
- Android 视频播放
- Android 自定义播放暂停图片
- android 堆内存和栈内存详解
- 【Android Gradle 插件】Android 依赖管理 ② ( 为工程配置依赖仓库 | 为工程构建添加依赖仓库 | classpath 引入依赖库 | 配置依赖仓库 )
- Android Vendor Test Suite (VTS) 作用及测试方法
- Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能