小超小调 2023-06-05 17:57 采纳率: 55.6%
浏览 32
已结题

Android framework短时间内发送多个相同的广播给app,如何做限制?

触发某个事件后会去调用Android framework的sendPermissionProtectedBroadcast函数,这个函数会发送指定广播出去,有权限的app都会接收这一条广播。

在做压力测试时,由于较长时间(60s)内频繁触发这个事件,然后在这60s内就发送了大量相同的广播,当测试停下来的时候,从日志中还能看到广播还在排队发送。所以怎么去限制这个广播的重复发送呢?

想法:我想的是当发送完一条广播后,如果10s内判断即将发送的广播Action如果和上一条一样,就不发送,这样就大大减少的发广播的次数。这样的话就需要记录上一条广播发送时间,然后在发下一跳广播的时候做计算。

        private void sendPermissionProtectedBroadcast(Intent intent) {
            if (mEventInstalledPackages.isEmpty()) {
                return;
            }
            intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
            for (String packageName : mEventInstalledPackages) {
                intent.setPackage(packageName);
                mContext.sendBroadcast(intent);
            }
        }
  • 写回答

2条回答 默认 最新

  • IT论之程序员 2023-06-06 20:58
    关注
    
    1. 添加一个变量来记录上一次发送广播的时间,比如:
    java
    private long mLastBroadcastTime;
    2. 在发送广播前判断,如果与上次发送时间间隔小于给定值(如10秒),则不发送:
    java
    long now = System.currentTimeMillis();
    if (now - mLastBroadcastTime < 10 * 1000) {
        return;  // 不发送广播
    }
    mLastBroadcastTime = now;  // 更新上次发送时间
    3. 发送广播的代码可以改成这样:
    java
    private void sendPermissionProtectedBroadcast(Intent intent) {
    
        if (shouldThrottleBroadcast()) {
            return;  // 不发送广播
        }
    
        // 发送广播逻辑...
        mLastBroadcastTime = System.currentTimeMillis();  // 更新上次发送时间
    }
    
    private boolean shouldThrottleBroadcast() {
        long now = System.currentTimeMillis();
        return now - mLastBroadcastTime < 10 * 1000;  // 10秒内
    } 
    这样就可以限制10秒内不会发送重复的广播,达到节流的效果。10秒这个时间可以根据你的需要灵活调整。
    这个思路就是通过记录上次发送广播的时间,在发送下一条广播前判断时间间隔,如果在给定阈值内就不发送,达到限制重复广播的目的。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月21日
  • 已采纳回答 6月13日
  • 创建了问题 6月5日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题