Android—广播(Broadcast)—广播的注意事项及相关问题分析
来源:互联网 发布:centos安装kafka 编辑:程序博客网 时间:2024/06/06 00:32
1.Intent.FLAG_RECEIVER_REGISTERED_ONLY
从前面两节的分析可以知道,对于静态注册的广播接收者,如果其所在进程不存在,ActivityManagerService是会先把它所在进程先启动,然后将广播发送给此广播接收者,鉴于此机制,有的应用为了保证自己进程被杀死后能被重新创建,所以会静态注册一些系统广播(例如电池电量变化的广播)的接收者,这样可以达到重启的目的,早期的Android版本上确实可以这么做。
后来Google应该也是意识到这种漏洞,所以对于一些系统广播,在其发送的时候,添加上了FLAG_RECEIVER_REGISTERED_ONLY的flag,这样就保证了这类广播只能通过动态注册的广播接收者来接收,例如下面是发送电池电量变化ACTION_BATTERY_CHANGED的广播时添加了FLAG_RECEIVER_REGISTERED_ONLY。
BatteryService.java
final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING);... ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL);
所以如果你也只想让你的广播只能动态注册的接收者收到,只要调用Intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY即可。
下面是一些常见的只支持动态注册接收者接收的系统广播:
2.前台广播和后台广播
从前面的分析可以知道,AMS是先通过把广播添加到对应的队列中,然后异步方式从队列里面取广播然后真正的开始发送广播,而目前AMS中有两个队列,在AMS的构造方式中有如下的部分:
ActivityManagerService.java
static final int BROADCAST_FG_TIMEOUT = 10*1000;static final int BROADCAST_BG_TIMEOUT = 60*1000;mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", BROADCAST_FG_TIMEOUT, false);mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", BROADCAST_BG_TIMEOUT, true);
BroadcastQueue.java
BroadcastQueue(ActivityManagerService service, Handler handler, String name, long timeoutPeriod, boolean allowDelayBehindServices) { mService = service; mHandler = new BroadcastHandler(handler.getLooper()); mQueueName = name; mTimeoutPeriod = timeoutPeriod; mDelayBehindServices = allowDelayBehindServices;}
AMS构造方法中构造了两个队列,一个前台队列,一个后台队列。结合其构造方法可知,两者区别在于一个是设置的广播超时时间不同,前台是10s,后台是60s,另外一个是是否要等待后台服务处理完,前台广播是不用等待的,后台广播需要等待。
想要让广播能放到前台队列中,只需调用Intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)即可。由于一般普通广播都默认是放在后台队列中的,所以会导致后台队列中的广播比较多,相对处理时间较长,所以为了能够让发送的广播优先被处理,将其设置为前台广播也算一个解决办法。
3.广播的接收延迟问题
广播使用起来成本比较低,用途也比较广泛,特别是可以突破进程限制,让所有相关的应用都可以收到广播,缺点也很明显,就是不够及时,谁也没法保证一定能在某个时间段内一定能收到某个广播,也就是广播的接收延时问题不可避免。
既然讲到广播接收延时,不得不先说下BroadcastRecord中关于记录广播的几个时间点:
针对表格内容,说明一下,所谓一次广播,是指用BroadcastRecord对象来表示的,该对象会被插入到广播队列中,插入的时间点存放在enqueueClockTime中,等到准备从队列中取出BroadcastRecord时,将当前的时间点记录在dispatchTime和dispatchClockTime中,每次广播的接收者可能有很多,对于动态注册的无序广播,由于不用关心广播是否都送到,所以不用统计receiverTime, 而对于有序广播来说,当从BroadcastRecord取出一个接收者时,将当前的时间点记录在receiverTime中,最后等到所有接收者都送达完毕,一次广播也就结束了,所以将此时结束的时间点记录在finishTime中。
另外也发现了,在将广播从队列中取出时,分别用了dispatchTime和dispatchClockTime来同时记录,两者获取的值有所不同,之所以要两个变量来记录,是因为dispatchTime会用来评定是否广播超时,而dispatchClockTime会最终记录到广播历史中,所谓广播历史是指AMS内部会将近期发送的广播保存起来,方便debug。
既然提供了这么多的时间相关的成员,那怎么才能显示出来了,方便用来调试呢,这里就要看下面讲的通过dump来打印相关信息了。只有把相关信息打印出来了,才能方便我们断定到底广播超时在哪里,是由谁引起的。
4.dump广播相关的信息
adb shell dumpsys activity b [packagename]
此命令主要是打印应用动态注册的广播接收者,可以通过此命令得知某个应用注册了哪些广播的监听,同时对于之前已经接收过的广播的一些时间信息,方便调试是否接收超时。如果命令后面不接包名,则默认打印手机所有应用的广播注册信息。
下面是打印微信的一些广播注册信息。
{ ~ } » adb shell dumpsys activity b com.tencent.mm ~ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts) //表明下面是打印应用通过动态注册的广播接收者,数据来源是AMS中的mRegisteredReceivers,下面依次遍历mRegisteredReceivers,打印每个ReceiverList信息 Registered Receivers: //打印具体某个ReceiverList的信息 * ReceiverList{de21349 8100 com.tencent.mm:push/10119/u0 remote:c1e4550} //打印注册此广播接收者的进程的信息,可以获取pid,uid等信息 app=8100:com.tencent.mm:push/u0a119 pid=8100 uid=10119 user=0 //打印IntentFilter的信息 Filter #0: BroadcastFilter{e98a44e} //打印具体的需要监听的广播 Action: "com.tencent.mm.WatchDogPushReceiver" AutoVerify=false * ReceiverList{a9160e1 8155 com.tencent.mm/10119/u0 remote:c5a6a48} app=8155:com.tencent.mm/u0a119 pid=8155 uid=10119 user=0 Filter #0: BroadcastFilter{a70fe06} Action: "android.intent.action.PACKAGE_ADDED" Scheme: "package" AutoVerify=false 。。。。//中间内容雷同,省略了 //下面也是打印应用通过动态注册的广播接收者,不过数据来源是AMS的mReceiverResolver,里面存储的是以BroadcastFilter为单位 Receiver Resolver Table: //打印InterFilter设置了Schemes的情况 Schemes: //根据具体的Scheme分类打印,将有相同Schemes的BroadcastFilter都打印出来 package: BroadcastFilter{a70fe06 u0 ReceiverList{a9160e1 8155 com.tencent.mm/10119/u0 remote:c5a6a48}} BroadcastFilter{a977675 u0 ReceiverList{483c9ac 16172 com.tencent.mm:support/10119/u0 remote:3e31b5f}} BroadcastFilter{64ecd4 u0 ReceiverList{6e3b227 16310 com.tencent.mm:tools/10119/u0 remote:905bce6}} file: BroadcastFilter{a977675 u0 ReceiverList{483c9ac 16172 com.tencent.mm:support/10119/u0 remote:3e31b5f}} BroadcastFilter{64ecd4 u0 ReceiverList{6e3b227 16310 com.tencent.mm:tools/10119/u0 remote:905bce6}} //打印InterFilter没有设置任何相关data的情况,可以通过此处了解到一个应用中到底有多少filter都添加了同一类广播的监听 Non-Data Actions: android.intent.action.SCREEN_OFF: BroadcastFilter{18ffed0 u0 ReceiverList{d801e93 8155 com.tencent.mm/10119/u0 remote:e4fa782}} BroadcastFilter{2add5b7 u0 ReceiverList{17af4b6 8155 com.tencent.mm/10119/u0 remote:c234451}} BroadcastFilter{8d8a7fe u0 ReceiverList{6b617b9 16172 com.tencent.mm:support/10119/u0 remote:cc6d580}} BroadcastFilter{6584f41 u0 ReceiverList{2089628 16310 com.tencent.mm:tools/10119/u0 remote:e999c4b}} android.hardware.usb.action.USB_DEVICE_ATTACHED: BroadcastFilter{605e699 u0 ReceiverList{a0b13e0 16172 com.tencent.mm:support/10119/u0 remote:af51de3}} BroadcastFilter{96a4888 u0 ReceiverList{e431c2b 16310 com.tencent.mm:tools/10119/u0 remote:ce03c7a}} com.tencent.mm.ui.ACTION_DEACTIVE: BroadcastFilter{35625d2 u0 ReceiverList{2ee585d 8155 com.tencent.mm/10119/u0 remote:d2e234}} android.intent.action.ACTION_POWER_DISCONNECTED: BroadcastFilter{18ffed0 u0 ReceiverList{d801e93 8155 com.tencent.mm/10119/u0 remote:e4fa782}} BroadcastFilter{823c7de u0 ReceiverList{e7c4b19 8155 com.tencent.mm/10119/u0 remote:f823a60}} BroadcastFilter{2add5b7 u0 ReceiverList{17af4b6 8155 com.tencent.mm/10119/u0 remote:c234451}} 。。。。//中间内容雷同,省略了 //打印一些之前跟该应用相关的广播过的广播,从这里可以获取到广播的相关时间点,方便调试 Historical broadcasts [background]: Historical Broadcast background #9: BroadcastRecord{ec22df u0 com.tencent.mm.plugin.report.service.KVCommCrossProcessReceiver} to user 0 Intent { act=com.tencent.mm.plugin.report.service.KVCommCrossProcessReceiver flg=0x10 (has extras) } targetComp: {com.tencent.mm/com.tencent.mm.plugin.report.service.KVCommCrossProcessReceiver} extras: Bundle[mParcelledData.dataSize=884] caller=com.tencent.mm 8100:com.tencent.mm:push/u0a119 pid=8100 uid=10119 enqueueClockTime=Mon Jul 10 19:34:23 GMT+08:00 2017 dispatchClockTime=Mon Jul 10 19:34:23 GMT+08:00 2017 enqueueTime=-48s780ms dispatchTime=-48s779ms finishTime=-48s763ms Total: +17ms Waiting: +1ms Processing: +16ms resultTo=null resultCode=0 resultData=null nextReceiver=1 receiver=null Receiver #0: ResolveInfo{ea4fb2c com.tencent.mm/.plugin.report.service.KVCommCrossProcessReceiver m=0x0} priority=0 preferredOrder=0 match=0x0 specificIndex=-1 isDefault=false ActivityInfo: name=com.tencent.mm.plugin.report.service.KVCommCrossProcessReceiver packageName=com.tencent.mm enabled=true exported=false processName=com.tencent.mm taskAffinity=com.tencent.mm targetActivity=null persistableMode=PERSIST_ROOT_ONLY resizeable=false lockTaskLaunchMode=LOCK_TASK_LAUNCH_MODE_DEFAULT needGuestControl=false ApplicationInfo: packageName=com.tencent.mm labelRes=0x7f08198f nonLocalizedLabel=null icon=0x7f020388 banner=0x0 className=com.tencent.mm.app.Application processName=com.tencent.mm taskAffinity=com.tencent.mm uid=10119 flags=0x38983e44 privateFlags=0x10 theme=0x7f0c003c flagsEx=0x0 requiresSmallestWidthDp=0 compatibleWidthLimitDp=0 largestWidthLimitDp=0 sourceDir=/data/app/com.tencent.mm-1/base.apk seinfo=default dataDir=/data/user/0/com.tencent.mm sharedLibraryFiles=[/system/framework/com.google.android.maps.jar] enabled=true targetSdkVersion=23 versionCode=1080 supportsRtl=false fullBackupContent=true mBroadcastsScheduled [foreground]=false mBroadcastsScheduled [background]=false mHandler: Handler (com.android.server.am.ActivityManagerService$MainHandler) {d3f1de2} @ 7689139 Looper (ActivityManager, tid 19) {dc6c573} Message 0: { when=+3m43s775ms callback=com.android.server.AppOpsService$1 target=com.android.server.am.ActivityManagerService$MainHandler callback=com.android.server.AppOpsService$1@7bd4c30 } Message 1: { when=+11m0s943ms what=27 target=com.android.server.am.ActivityManagerService$MainHandler } (Total messages: 2, polling=true, quitting=false){ ~ } » ~
adb shell dumpsys package [packagename]
这个命令可以打印应用在AndroidManifest中静态注册的四大组件的所有相关信息,当然静态注册的Receiver也在其中了。
这里还是以微信作为例子,直接在终端运行adb shell dumpsys package com.tencent.mm,然后在输出的内容中先搜关键字“Receiver Resolver Table”,根据是否设置了Schemes和Data进行分类,内容如下:
Receiver Resolver Table: Schemes: file: e7366c8 com.tencent.mm/.booter.MountReceiver filter e7dc3e2 Action: "android.intent.action.MEDIA_MOUNTED" Action: "android.intent.action.MEDIA_EJECT" Action: "android.intent.action.MEDIA_UNMOUNTED" Action: "android.intent.action.MEDIA_SHARED" Action: "android.intent.action.MEDIA_SCANNER_STARTED" Action: "android.intent.action.MEDIA_SCANNER_FINISHED" Action: "android.intent.action.MEDIA_REMOVED" Action: "android.intent.action.MEDIA_BAD_REMOVAL" Scheme: "file" AutoVerify=false Non-Data Actions: android.media.ACTION_SCO_AUDIO_STATE_UPDATED: e1368f4 com.tencent.mm/.booter.BluetoothReceiver filter 77373 Action: "android.media.SCO_AUDIO_STATE_CHANGED" Action: "android.media.ACTION_SCO_AUDIO_STATE_UPDATED" AutoVerify=false com.tencent.mm.permission.MM_AUTO_REPLY_MESSAGE: 119f251 com.tencent.mm/.plugin.auto.service.MMAutoMessageReplyReceiver filter 10fed3a Action: "com.tencent.mm.permission.MM_AUTO_REPLY_MESSAGE" AutoVerify=false android.bluetooth.adapter.action.STATE_CHANGED: eb4facb com.tencent.mm/.booter.BluetoothStateReceiver filter 13864ad Action: "android.bluetooth.adapter.action.STATE_CHANGED" AutoVerify=false com.tencent.mm.Intent.ACTION_CLICK_FILEDOWNLOAD_NOTIFICATION: 7fe7154 com.tencent.mm/.pluginsdk.ui.FileDownloadNotificationClickReceiver filter 43c715c Action: "com.tencent.mm.Intent.ACTION_CLICK_FILEDOWNLOAD_NOTIFICATION" AutoVerify=false android.net.conn.CONNECTIVITY_CHANGE: bce5005 com.tencent.mm/.booter.MMReceivers$ConnectionReceiver filter 8a86dc7 Action: "android.net.conn.CONNECTIVITY_CHANGE" AutoVerify=false com.android.vending.INSTALL_REFERRER: fb89379 com.tencent.mm/.booter.InstallReceiver filter 64b6230 Action: "com.android.vending.INSTALL_REFERRER" AutoVerify=false com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_REGISTER: a3abcb9 com.tencent.mm/.plugin.base.stub.WXEntryActivity$EntryReceiver filter 4383c2e Action: "com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_REGISTER" Action: "com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_UNREGISTER" AutoVerify=false com.google.android.c2dm.intent.RECEIVE: 55f8b7b com.tencent.mm/.plugin.gcm.modelgcm.GcmBroadcastReceiver filter 2ebddeb Action: "com.google.android.c2dm.intent.RECEIVE" Action: "com.google.android.c2dm.intent.REGISTRATION" Category: "com.tencent.mm" AutoVerify=false com.tencent.mm.permission.MM_AUTO_HEARD_MESSAGE: ec10b99 com.tencent.mm/.plugin.auto.service.MMAutoMessageHeardReceiver filter 16e7c65 Action: "com.tencent.mm.permission.MM_AUTO_HEARD_MESSAGE" AutoVerify=false android.media.SCO_AUDIO_STATE_CHANGED: e1368f4 com.tencent.mm/.booter.BluetoothReceiver filter 77373 Action: "android.media.SCO_AUDIO_STATE_CHANGED" Action: "android.media.ACTION_SCO_AUDIO_STATE_UPDATED" AutoVerify=false android.intent.action.BOOT_COMPLETED: e8a1535 com.tencent.mm/.booter.MMReceivers$ExdeviceProcessReceiver filter ecf79e1 Action: "android.intent.action.BOOT_COMPLETED" AutoVerify=false f3f5dca com.tencent.mm/.booter.MMReceivers$BootReceiver filter a7fa306 Action: "android.intent.action.BOOT_COMPLETED" AutoVerify=false MMBakchatServiceStart: 7a3c3e9 com.tencent.mm/.plugin.backup.bakoldlogic.bakoldmodel.BakOldUSBReceiver filter 7239ea9 Action: "MMBakchatServiceStart" Action: "MMBakchatServiceStop" AutoVerify=false com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_UNREGISTER: a3abcb9 com.tencent.mm/.plugin.base.stub.WXEntryActivity$EntryReceiver filter 4383c2e Action: "com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_REGISTER" Action: "com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_UNREGISTER" AutoVerify=false android.intent.action.DOWNLOAD_COMPLETE: a6efa91 com.tencent.mm/.pluginsdk.model.downloader.FileDownloadReceiver filter 7dbd3cf Action: "android.intent.action.DOWNLOAD_COMPLETE" AutoVerify=false MMBakchatServiceStop: 7a3c3e9 com.tencent.mm/.plugin.backup.bakoldlogic.bakoldmodel.BakOldUSBReceiver filter 7239ea9 Action: "MMBakchatServiceStart" Action: "MMBakchatServiceStop" AutoVerify=false com.google.android.c2dm.intent.REGISTRATION: 55f8b7b com.tencent.mm/.plugin.gcm.modelgcm.GcmBroadcastReceiver filter 2ebddeb Action: "com.google.android.c2dm.intent.RECEIVE" Action: "com.google.android.c2dm.intent.REGISTRATION" Category: "com.tencent.mm" AutoVerify=false com.tencent.mm..plugin.photoedit.action.clear: 23401a9 com.tencent.mm/.plugin.photoedit.cache.ArtistCacheManager filter acd4748 Action: "com.tencent.mm..plugin.photoedit.action.clear" AutoVerify=false com.tencent.mm.Intent.ACTION_CLICK_FLOW_REPORT: 1383648 com.tencent.mm/.booter.ClickFlowReceiver filter 3272dc4 Action: "com.tencent.mm.Intent.ACTION_CLICK_FLOW_REPORT" AutoVerify=false
adb shell dumpsys activity b history
为了方便调试广播,框架会专门记住最近发送过的广播到相关数据中,然后通过dump信息打印出来,记录的信息分为两部分:
在BroadcastQueue.java中mBroadcastHistory 用于存储最近发送过的广播BroadcastRecord,数组最大值是MAX_BROADCAST_HISTORY,在Android N上通常是50条。
另外在BroadcastQueue.java中分别通过mBroadcastSummaryHistory,mSummaryHistoryEnqueueTime,mSummaryHistoryDispatchTime,mSummaryHistoryFinishTime用来存储最近发送的广播的intent,enqueueClockTime,dispatchClockTime,插入时间System.currentTimeMillis(),数组最大值是MAX_BROADCAST_SUMMARY_HISTORY,在Android N上通常是300条。
dumpsy打印的顺序依次是先打印foreground队列的 mBroadcastHistory 和summaryHistory,之后是background队列的mBroadcastHistory 和summaryHistory,而且是按照时间从最近开始排序。
adb shell dumpsys activity b historyACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts) Historical broadcasts [foreground]: Historical Broadcast foreground #0: BroadcastRecord{e788d4d u-1 android.intent.action.TIME_TICK} to user -1 Intent { act=android.intent.action.TIME_TICK flg=0x50000014 (has extras) } extras: Bundle[{android.intent.extra.ALARM_COUNT=1}] caller=android null pid=-1 uid=1000 enqueueClockTime=2017-09-22 17:06:00 dispatchClockTime=2017-09-22 17:06:00 dispatchTime=-30s130ms (0 since enq) finishTime=-30s16ms (+114ms since disp) Total: +114ms Waiting: 0 Processing: +114ms resultTo=null resultCode=0 resultData=null resultAbort=false ordered=true sticky=false initialSticky=false nextReceiver=14 receiver=null Deliver #0: BroadcastFilter{1a7dcc6 u0 ReceiverList{a7182a1 1261 system/1000/u0 local:282fb08}} Deliver #1: BroadcastFilter{e0830a1 u0 ReceiverList{cafa108 1261 system/1000/u0 local:55c86ab}} Deliver #2: BroadcastFilter{56fb47 u0 ReceiverList{fc1f686 1897 com.android.systemui/10037/u0 remote:c20eb61}} Deliver #3: BroadcastFilter{aa9b3f u0 ReceiverList{ed0bb5e 1897 com.android.systemui/10037/u0 remote:bbedc99}} Deliver #4: BroadcastFilter{e3551f1 u0 ReceiverList{ee23598 1897 com.android.systemui/10037/u0 remote:dc1537b}} Deliver #5: BroadcastFilter{f971399 u0 ReceiverList{9a0d4e0 1897 com.android.systemui/10037/u0 remote:23542e3}} Deliver #6: BroadcastFilter{a1bcc2 u0 ReceiverList{8bf350d 1897 com.android.systemui/10037/u0 remote:1ff83a4}} Deliver #7: BroadcastFilter{3de536c u0 ReceiverList{aceb41f 1897 com.android.systemui/10037/u0 remote:bc42bbe}} Deliver #8: BroadcastFilter{c262524 u0 ReceiverList{aa059b7 1897 com.android.systemui/10037/u0 remote:75508b6}} Deliver #9: BroadcastFilter{3d6da53 u0 ReceiverList{aa0fa42 1897 com.android.systemui/10037/u0 remote:966f88d}} Deliver #10: BroadcastFilter{7c671d5 u0 ReceiverList{12e168c 2570 com.flyme.systemuitools/10037/u0 remote:5850fbf}} Deliver #11: BroadcastFilter{38320d2 u0 ReceiverList{2165f5d 2405 com.flyme.telecom.usagedata.service/1001/u0 remote:90aa534}} Deliver #12: BroadcastFilter{a7d40af u0 ReceiverList{ab9d08e 4977 com.meizu.net.pedometer/10097/u0 remote:4d74889}} Deliver #13: BroadcastFilter{1da82e8 u0 ReceiverList{780440b 1897 com.android.systemui/10037/u0 remote:67b97da}} 。。。 Historical Broadcast foreground #49: BroadcastRecord{969e10c u-1 android.intent.action.TIME_TICK} to user -1 。。。 Historical broadcasts summary [foreground]: #0: act=android.intent.action.TIME_TICK flg=0x50000014 (has extras) 0 dispatch +114ms finish enq=2017-09-22 17:06:00 disp=2017-09-22 17:06:00 fin=2017-09-22 17:06:00 extras: Bundle[{android.intent.extra.ALARM_COUNT=1}] #199: act=android.hardware.usb.action.USB_STATE flg=0x30000010 (has extras) 0 dispatch 0 finish enq=2017-09-22 14:28:59 disp=2017-09-22 14:28:59 fin=2017-09-22 14:28:59 extras: Bundle[{host_connected=false, connected=true, unlocked=false, adb=true, configured=true, USB_HW_DISCONNECTED=false}] Historical broadcasts [background]: Historical Broadcast background #0: BroadcastRecord{b013415 u-1 android.net.wifi.RSSI_CHANGED} to user -1 Intent { act=android.net.wifi.RSSI_CHANGED flg=0x4000010 (has extras) } targetComp: {com.baidu.wenku/com.baidu.wenku.service.PushReceiver} extras: Bundle[{newRssi=-62}] caller=android 1261:system/1000 pid=1261 uid=1000 enqueueClockTime=2017-09-22 17:06:21 dispatchClockTime=2017-09-22 17:06:21 dispatchTime=-8s612ms (+6ms since enq) finishTime=-8s545ms (+67ms since disp) Total: +73ms Waiting: +6ms Processing: +67ms resultTo=null resultCode=0 resultData=null resultAbort=false ordered=false sticky=true initialSticky=false nextReceiver=2 receiver=null Deliver #0: (manifest) priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false ActivityInfo: name=com.meizu.broadcast.WifiReceiver packageName=com.meizu.monitorphone enabled=true exported=true directBootAware=false resizeMode=RESIZE_MODE_RESIZEABLE needGuestControl=false Deliver #1: (manifest) priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false ActivityInfo: name=com.meizu.testdev.woody.receiver.WifiReceiver packageName=com.meizu.testdev.woody enabled=true exported=true directBootAware=false resizeMode=RESIZE_MODE_RESIZEABLE needGuestControl=false 。。。。 Historical Broadcast background #49: BroadcastRecord{40c965d u-1 android.intent.action.ACCESS_CONTROL_CHANGED} to user -1 Historical broadcasts summary [background]: #0: act=android.net.wifi.RSSI_CHANGED flg=0x4000010 (has extras) +6ms dispatch +67ms finish enq=2017-09-22 17:06:21 disp=2017-09-22 17:06:21 fin=2017-09-22 17:06:21 extras: Bundle[{newRssi=-62}] #299: act=android.net.wifi.RSSI_CHANGED flg=0x4000010 (has extras) +24ms dispatch +1ms finish enq=2017-09-22 15:25:34 disp=2017-09-22 15:25:34 fin=2017-09-22 15:25:34 extras: Bundle[{newRssi=-61}]
5.打开广播相关log
adb shell dumpsys activity log br on
不过这个只限于mtk的代码,Android 原生代码并没有提供命令来打开广播相关log。
参考资料:
http://blog.csdn.net/gemmem/article/details/8859493
http://blog.csdn.net/weihan1314/article/details/7973511/
- Android—广播(Broadcast)—广播的注意事项及相关问题分析
- Android---广播(Broadcast)---广播接收者的注册过程分析
- Android---广播(Broadcast)---广播发送的过程分析
- android广播Broadcast—笔记
- Android广播(BroadCast)
- Android Broadcast广播机制分析
- Android Broadcast广播机制分析
- Android 7.0 ActivityManagerService(5) 广播(Broadcast)相关流程分析
- Android 7.0 ActivityManagerService 广播(Broadcast)相关流程分析
- Android 广播(Broadcast)及广播接收器(BroadcastReceiver)的使用
- 广播——broadcast
- Android开发:广播机制:Broadcast——自定义广播方法
- Android学习Broadcast Receiver(广播接收者) 注意事项
- Android的广播机制——Broadcast Reciver
- 初识android的广播BroadCast
- Android的Broadcast广播-笔记
- Android之广播(Broadcast)
- Android--启动广播(Broadcast)
- codeforces--Spreadsheets(模拟)
- STL: Map 的操作
- 二叉树的递归遍历
- Codeforces 282C XOR and OR【思维】
- Coursera解决无法播放视频问题
- Android—广播(Broadcast)—广播的注意事项及相关问题分析
- EA&UML日拱一卒-活动图::CallOperationAction(续)
- 【NOIP2016提高A组模拟7.21】Clock Sequence
- 梯度提升树GBDT原理
- LeetCode 83 Remove Duplicates from Sorted List (链表)
- 你一无所有时,没人在乎你面子
- linux下安装sqlite3
- js日期
- MOOC清华《程序设计基础》第4章第2题:最高分与最低分(用线性查找法做)