解决 MulticastLock 耗电问题

起因

google 发了封邮件,ES 一直持有 Multicast Locks 导致耗电量增加。

解决方案

1.Utils 增加 getWifiManage 方法,防止内存泄露,加上Nullable注解。

On versions prior to Android N (24), initializing the WifiManager via Context#getSystemService can cause a memory leak if the context is not the application context.

@Nullable
public static WifiManager getWifiManage() {
    return (WifiManager) MainApplication.getInstance().getApplicationContext()
                             .getSystemService(Context.WIFI_SERVICE);
}

2.增加锁屏销毁组播,亮屏启动组播。释放监听的端口


IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
MainApplication.getInstance().registerReceiver(mBroadcastReceiver, filter);


case Intent.ACTION_SCREEN_OFF:
    destoryZeroconf(); // 执行 MulticastSocket 的 close 方法关闭组播
    break;
case Intent.ACTION_SCREEN_ON:
    if (NetworkUtils.isWifiAvailable()) {
        initZeroconf(); // 重启组播
    }
    break;

3.去掉 MulticastLock 锁

不再需要 MulticastLock 锁,同时方便通过代码静态检查。

总结

经过上面的操作,在屏幕打开的时候才监听组播。屏幕关闭的时候就不消耗电量去监听。

同时 ES 有另外的 UDP 端口以及缓存方案去接收局域网的扫描请求,关闭组播不会导致功能的失效。

参考

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,288评论 25 708
  • 四海八荒,神迹罕现, 花神芊凌,初降人间, 险象环生,偶遇凡人, 名曰玉生,孑然一身, 两情相悦,修房筑瓦, 一晃...
    狮子王他爹阅读 275评论 0 0
  • 昨天晚上8点,我做了自己在千聊上的第一次分享,主题是《DISC高效阅读:如何做到一年读书200本》,这也是我在除了...
    小说家郭大侠阅读 432评论 2 2