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

说说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的时候,会把这些都串起来。

时间: 2024-09-14 15:43:11

说说Android的广播(5) - 广播的历史的相关文章

Android 监听wifi广播的两种方式

 1.XML中声明 <receiver android:name=".NetworkConnectChangedReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED"

说说Android的广播(1) - 普通广播,有序广播和粘性广播

说说Android的广播 对于Activity的启动流程,我们已经有了几个版本的分析了.这里我们分析一个更容易一些的,四大组件中最简单的Broadcast Receiver. 关于Broadcast,有几点需要了解.首先是广播的类型,然后是广播的发送方法,最后是广播是如何被接收的.这三者相辅相承的,比如普通广播和有序广播只有在详细了解了广播的接收过程了之后,才能真正明白它的含义. 广播的类型:普通广播,有序广播和粘性广播 普通的广播是不在意顺序的,最简单的理解是同时可以收到这个广播.如果应用是动

Android组件系列----BroadcastReceiver广播接收器

[正文] 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码.广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期.所以有的时候我们可以把它当做函数看也未必不可. 和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的.也不推荐在里面开子线程,因为往往

broadcast-求大神android发送有序的广播问题

问题描述 求大神android发送有序的广播问题 应用程序接收广播跟版本有关吗? 有序的广播每个版本的顺序都不一样么? 我写了两个应用一个是MyBroadcastReceiver和AnotherBroadcastReceiver, 同样接收com.kakabuli.MY_BROADCAST这条广播 在API 10中接收的是AnotherBroadcastReceiver的吐司先,然后是MyBroadcastReceiver,我测试了20多次每一次都一样的顺序 在API 19中接收的是MyBroa

Android 中在有序广播中添加自定义权限的实例

Android 中在有序广播中添加自定义权限的实例 前言; 有序广播说明: 有序广播因为要处理消息的处理结果,所以要复杂一些. * sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras); 如果只是想让广播

17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限

 1  Broadcast是Android中的四大组件之一,他的用途很大,比如系统的一些广播:电量低.开机.锁屏等一些操作都会发送一个广播. 2  广播被分为两种不同的类型:"普通广播(Normalbroadcasts)"和"有序广播(Ordered broadcasts)".普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播:然后有序广

Android中的Intent广播(broadcast)简介

Intent可以使用sendBroadcast(), 在应用组件之间广播事件; 使用BroadReceiver类监听和响应Broadcast Intent, 需要注册(register)和过滤器(intent-filter); 1. 创建Broadcast Intent 构建需要广播的Intent, 包含Intent标识字符串, 和数据(data, extras), 使用sendBroadcast()发送; Intent标识字符串, 可以标识要广播的字符串, 应该是能够标志的唯一字符串, pub

Android——发送和接收广播

一,发送广播   利用Intent来发送广播. 使用:在需要发送广播的地方创建一个Intent对象,将信息的内容和用于过滤的信息封装起来,通过以下三种方法将Intent广播出去: 1,Context.sendBroadcast 2,Context.sendOrderedBroadCast 3,Context.sendStickyBroadcast   三种方法的区别: 1,sendBroadcast和sendStickyBroadcast发送出去的Intent,对于所有满足条件的Broadcas

Android学习之本地广播使用方法详解

本地广播信息只能在应用程序内部传递,同时广播接收器也只能接收应用程序内部的广播消息. MainActivity代码 package com.example.luobo.mybroadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; imp