Android-电量优化

电量优化

在这里插入图片描述
在这里插入图片描述
A n d r o i d 的 硬 件 特 点
l 指 纹 感 应 器
l 心 律 监 控
l 环 境 光 度 感 应 器
l 温 度 湿 度 感 应 器
l 气 压 计
l N F C
l 陀 螺 仪
l 加 速 计
l 蓝 牙
l W i - F i
l 调 频 / 蜂 窝 无 线 电
l 前 置 / 后 置 摄 像 头
l G P S
l 磁 场 探 测 器
l 麦 克 风
l 触 摸 功 能

耗 电 原 因
l A n d r o i d 能 耗 统 计 文 件
• f r a m e w o r k s \ b a s e \ c o r e \ r e s \ r e s \ x m l \ p o w e r _ p r o f i l e . x m l
l 电 量 统 计 原 理
• f r a m e w o r k s / b a s e / s e r v i c e s / c o r e /j a v a / c o m / a n d r o i d / s e r v e r / a m /
B a t t e r y St a t s S e r v i c e .j a v a
• A p p U s a g e : 应 用 程 序 耗 电 量 计 算 , 是 指 每 一 个 应 用 程 序 使 用 硬 件 模 块 所
产 生 的 耗 电 量 , 注 意 是 按 照 U i d 统 计 s h a r e d u i d
• M i s c U s a g e : 其 他 杂 项 耗 电 量 计 算 , 所 谓 杂 项 , 其 实 就 是 用 户 比 较 关 心
的 一 大 类 , 包 括 : 待 机 的 耗 电 量 、 亮 屏 的 耗 电 量 、 通 话 的 耗 电 量 、 W i f i 的
耗 电 量 等

 p r o c e s s c p u t i m e
p o w e r = C P U 每 个 频 率 等 级 下 工 作 的 时 间 比 例 / C P U 工 作 总 时 间 * 应 用 运 行 总 时 间
 p r o c e s s w a k e l o c k u s a g e
p o w e r = 进 程 w a k e l o c k 时 间 * p o w e r _ p r o f i l e r. x m l 中 t y p e = c p u _ a w a k e 的 数 值
 c o s t o f m o b i l e t r a f f i c ( 注 : R : r e c e i v e ( 接 收 ) T : t r a n s m i t ( 传 输 ) 下 同 )
p o w e r = ( m o b i l e R x + m o b i l e Tx ) * m o b i l e Po w e r Pe r B y t e
 c o s t o f k e e p i n g W I F I r u n n i n g
p o w e r = w i f i R u n n i n g T i m e M s * a v e r a g e Po w e r ( P O W E R _ W I F I _ O N )
 c o s t o f W I F I s c a n s w i f i
p o w e r = w i f i S c a n T i m e M s * a v e r a g e r Po w e r ( P O W E R _ W I F I _ S C A N )
 P r o c e s s S e n s o r u s a g e 计 算 u i d 的 每 个 传 感 器 的 耗 电
p o w e r = a v e r a g e Po w e r ( 不 同 传 感 器 的 耗 电 ) * s e n s o r T i m e
 通 话 时 间
p o w e r = p h o n e O n T i m e M s * a v e r a g e r Po w e r ( P O W E R _ R A D I O _ A C T I V E )
 待 机 耗 电
p o w e r = i d l e T i m e M s * a v e r a g e Po w e r ( P O W E R _ C P U _ I D L E )
 w i f i 开 启 时 的 耗 电 量
p o w e r = r u n n i n g T i m e M s * a v e r a g e Po w e r ( P O W E R _ W I F I _ O N ) + w i f i u i d 耗 电
 蓝 牙 耗 电 量
p o w e r = b t O n T i m e M s * a v e r a g e Po w e r ( P O W E R _ B L U E TO OT H _ O N ) + b t P i n g C o u n t *
a v e r a g e Po w e r ( P O W E R _ B L U E TO OT H _ AT _ C M D ) + b l u e t o o t h u i d 耗 电
 手 机 基 站 信 号 耗 电 量
手 机 信 号 有 五 个 信 号 强 度 , 耗 电 量 是 每 个 信 号 强 度 的 耗 电 量 的 累 加
p o w e r = s t r e n g t h T i m e M s * a v e r a g e Po w e r ( P O W E R _ R A D I O _ O N ) + s c a n n i n g T i m e M s *
a v e r a g e Po w e r ( P O W E R _ R A D I O _ S C A N N I N G )
 屏 幕 耗 电
p o w e r = s c r e e n O n T i m e M s * a v e r a g e Po w e r ( P O W E R _ S C R E E N _ O N ) + b r i g h t n e s s T i m e ( 不 同 亮 度
的 时 间 ) * s c r e e n B i n Po w e r ( 不 同 亮 度 的 电 流 强 度 )

电 能 统 计
① 重 置 电 能 统 计
a ) a d b s h e l l d u m p s y s b a t t e r y s t a t s - - r e s e t
b ) a d b s h e l l d u m p s y s - - e n a b l e f u l l - w a k e - h i s t o r y
② 文 本 分 析
a ) a d b s h e l l d u m p s y s b a t t e r y s t a t s > b a t t e r y s t a t s . t x t
b ) a d b s h e l l d u m p s y s b a t t e r y s t a t s > c o m . x x x . x x x > b a t t e r y s t a t s . t x t
③ B a t t e r y H i s t o r i a n 2 . 0 分 析
a ) a d b b u g r e p o r t x x x _ b u g r e p o r t . z i p
b ) a d b b u g r e p o r t x x x _ b u g r e p o r t . t x t ( 6 . 0 及 以 下 的 )
b a t t e r y s t a t s . t x t 分 析
① B a t t e r y H i s t o r y : 耗 电 统 计 的 历 史 记 录 , 每 一 条 记 录 以 H i s t o r y I t e m 的 形 式 存 在
② Pe r- P I D St a t s : 每 个 进 程 唤 醒 工 作 的 时 间
③ D i s c h a r g e s t e p d u r a t i o n s : 每 掉 一 隔 电 的 时 间 点 和 设 备 的 状 态
④ D a i l y s t a t s : 以 天 为 单 位 展 示 每 掉 一 隔 电 的 时 间 点 和 设 备 状 态
⑤ St a t i s t i c s s i n c e l a s t c h a r g e : 从 上 次 充 电 以 来 的 统 计 详 情 , 包 含 很 多 子 板 块
⑥ C e l l u l a r St a t i s t i c s : 移 动 数 据 网 络 状 态 和 使 用 情 况
⑦ W i f i St a t i s t i c s : W I F I 的 网 络 状 态 和 使 用 情 况
⑧ B l u e t o o t h : 蓝 牙 在 不 同 工 作 状 态 下 的 使 用 情 况
⑨ E s t i m a t e d p o w e r u s e ( m A h ) : 近 似 计 算 出 的 各 个 用 户 ( u i d ) 的 耗 电 量 , 一 个 A P K 通 常 对 应 到 一
个 用 户 , 当 然 , 也 有 多 个 A P K 共 享 一 个 用 户 的 情 况
⑩ A l l k e r n e l w a k e l o c k s : 内 核 锁 的 使 用 统 计
⑪ A l l p a r t i a l w a k e l o c k s : 应 用 锁 的 使 用 统 计
⑫ A l l w a k e u p r e a s o n s : 所 有 的 唤 醒 原 因
⑬ St a t i s t i c s b y u i d : 每 一 个 u i d 的 耗 电 细 节
B a t t e r y H i s t o r i a n 2 . 0 分 析
① h t t p s : / / w w w.j i a n s h u . c o m / p / 3 7 8 c f 6 7 8 b d e b
② 只 能 定 位 大 概 的 问 题 , 需 要 结 合 代 码 分 析
在这里插入图片描述
在这里插入图片描述
在应用内调节亮度不太现实,一般由系统控制,在设计页面时可以考虑在不影响美观的情况下
,优先使用深色,当然还是以应用的实际场景考虑优先

网 络
移 动 网 络
• F u l l p o w e r : 能 量 最 高 的 状 态 , 移 动 网 络 连 接 被 激 活 , 允 许 设 备 以 最 大 的 传 输 速 率 进 行 操 作 。
• L o w p o w e r : 一 种 中 间 状 态 , 对 电 量 的 消 耗 差 不 多 是 F u l l p o w e r 状 态 下 的 5 0 %
• St a n d b y : 最 低 的 状 态 , 没 有 数 据 连 接 需 要 传 输 , 电 量 消 耗 最 少
在这里插入图片描述
你的App在使用RRC状态机码?
在这里插入图片描述
网 络
W i - F i
• 在 理 想 情 况 下 , 吞 吐 量 大 , 延 迟 低 , 通 常 是 不 计 费
• 以 一 种 更 加 ” 渴 望 数 据 ” 的 方 式 运 行
G P S 优 化

  • 精 准 度 要 求 不 高 不 用 需 要 开 启 G P S , 蜂 窝 无 线 提 供 的 数 据 足 以
  • 避 免 在 信 号 弱 ( 地 下 室 ) 开 启 G P S
    通常情况下,使用Wi-Fi连接网络的功耗要低于移动网络
    网 络 优 化
  • 增 量 拉 取 数 据
  • 界 面 展 示 的 数 据 非 W i - F i 下 不 预 取
  • 实 时 的 信 息 上 报 后 台 运 行 时 改 成 非 实 时 上 报
  • 非 W i - F i 场 景 减 低 耗 流 量 的 功 能 的 网 络 通 信 频 率
  • 合 并 网 络 请 求 , 减 少 请 求 次 数
  • 尽 量 利 用 W i - F i 传 输 信 息

C P U
C P U 频 率
• C P U 频 率 表 示 C P U 的 计 算 能 力 , 频 率 决 定 C P U 周 期 , 互 为 倒 数 , C P U 主 频 越 快 , 耗 时越 短C P U 时 间 片
• 在 计 算 机 中 , 每 隔 N 个 高 电 频 脉 冲 , 时 钟 计 算 器 加 1 , 可 以 把 自 然 时 间 分 成 固 定 的 小 块 ,这 个 就 是
• 时 间 片 , C P U 时 间 片 1 0 m s 单 位 是j i f f i e sC P U 利 用 率
• C P U 分 用 户 态 , 系 统 态 , 空 闲 态 , 利 用 率 = ( 执 行 用 户 态 + 系 统 态 的j i f f i e s ) / 总j i f f i e s

变 频
O n d e m a n d : 官 方 内 核 默 认 使 用 这 种 调 速 器 , 规 则 是 有 高 需 求 , 迅 速 跳 到 最 大 频 率 , 有 低 需 求 时 ,
迅 速 降 到 最 小 频 率
C o n s e r v a t i v e : 规 则 是 慢 升 快 降 , 注 重 省 电 , 有 高 需 求 , 逐 渐 提 高 频 率 , 有 低 需 求 时 , 迅 速 跳 到 最
小 频 率
I n t e r a c t i v e : 规 则 是 快 升 慢 降 , 有 高 需 求 , 逐 渐 提 高 频 率 , 有 低 需 求 时 , 逐 渐 减 低 频 率
L u l z a c t i v e : 根 据 负 载 逐 级 升 高 或 者 降 低 频 率
Po w e r s a v e : 把 频 率 锁 定 在 设 定 范 围 的 最 小 值 , 负 载 再 高 也 不 升 高 频 率 , 很 省 电
Pe r f o r m a n c e : 把 频 率 锁 定 在 设 定 范 围 的 最 大 值 , 无 论 负 载 如 何 , C P U 都 全 速 运 行 , 很 费 电
CPU 的利用率高就越耗电 ✖
CPU的频率高才越耗电✔

计 算 优 化

  • 尽 量 避 开 浮 点 运 算
  • 除 法 变 乘 法
  • 充 分 利 用 位 移
  • 查 表 法 , 直 接 使 用 映 射 关 系 , 但 会 增 加 内 存 , 视 具 体 场 景 来 定
  • 利 用 a r m n e o n 指 令 集 做 并 行 运 算 , 需 要 A R M V 7 及 以 上 架 构 C P U 才 能 支 持
    避 免 W a k e L o c k 使 用 不 当
    避 免 A l a r m M a n a g e r 使 用 不 当
    使 用 J o b S c h e d u l e r

W a k e L o c k 策 略
PA RT I A L _ WA K E _ LO C K : 保 持 C P U 运 转 , 屏 幕 和 键 盘 灯 有 可 能 是 关 闭 的 。
S C R E E N _ D I M _ WA K E _ LO C K : 保 持 C P U 运 转 , 允 许 保 持 屏 幕 显 示 但 有 可 能 是 灰 的 , 允 许 关 闭 键盘 灯
S C R E E N _ B R I G H T _ WA K E _ LO C K : 保 持 C P U 运 转 , 保 持 屏 幕 高 亮 显 示 , 允 许 关 闭 键 盘 灯
F U L L _ WA K E _ LO C K : 保 持 C P U 运 转 , 保 持 屏 幕 高 亮 显 示 , 键 盘 灯 也 保 持 亮 度
A CQ U I R E _ C A U S E S _ WA K E U P : 不 会 唤 醒 设 备 , 强 制 屏 幕 马 上 高 亮 显 示 , 键 盘 灯 开 启 。 有 一 个 例外 , 如 果 有 n o t i f i c a t i o n 弹 出 的 话 , 会 唤 醒 设 备 。
O N _ A F T E R _ R E L E A S E : Wa k e L o c k 被 释 放 后 , 维 持 屏 幕 亮 度 一 小 段 时 间 , 减 少 Wa k e L o c k 循 环时 的 闪 烁 情 况

4 种 A l a r m 类 型

  • RTC _ WA K E U P 在 指 定 的 时 刻 ( 设 置 A l a r m 的 时 候 ) , 唤 醒 设 备 来 触 发 I n t e n t
  • RTC 在 一 个 显 式 的 时 间 触 发 I n t e n t , 但 不 唤 醒 设 备
  • E L A P S E D _ R E A LT I M E 从 设 备 启 动 后 , 如 果 流 逝 的 时 间 达 到 总 时 间 , 那 么 触 发 I n t e n t , 但 不唤 醒 设 备 。 流 逝 的 时 间 包 括 设 备 睡 眠 的 任 何 时 间 。 注 意 一 点 的 是 , 时 间 流 逝 的 计 算 点 是 自 从 它
    最 后 一 次 启 动 算 起 。
  • E L A P S E D _ R E A LT I M E _ WA K E U P 从 设 备 启 动 后 , 达 到 流 逝 的 总 时 间 后 , 如 果 需 要 将 唤 醒 设备 并 触 发 I n t e n t

考 虑 使 用 J o b S c h e d u l e r ( W o r k M a n a g e r )

  • 重 要 不 紧 急 的 任 务 , 可 以 延 迟 执 行 , 如 定 期 数 据 库 更 新 和 数 据 上 报
  • 耗 电 量 较 大 的 任 务 , 比 如 充 电 时 才 希 望 执 行 备 份 数 据 操 作
  • 不 紧 急 可 以 不 执 行 的 网 络 任 务 , 如 在 W i - F i 环 境 预 加 载 数 据
  • 可 以 批 量 执 行 的 任 务

D o z e 模 式
若 判 断 用 户 在 连 续 的 一 段 时 间 内 没 有 使 用 手 机 , 就 延 缓 终 端 中 A P P 后 台 的 C P U 和 网 络 活 动 , 以达 到 减 少 电 量 消 耗 的 目 的 。
在这里插入图片描述
在这里插入图片描述
应 用 常 造 成 的 功 耗 问 题 : 设 计 与编 码 需 避 免 的 面 向

  • 阻 止 手 机 休 眠
  • 时 常 唤 醒 手 机
  • 后 台 频 繁 运 行
  • 过 度 绘 制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Alarm
• 需使用 alarm 的场合
• 应用进程即使不存在,也需在某段时间在后台启动做事。例如:定时与服务器同步邮件
• 4 种 alarm
• ELAPSED_REALTIME:在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会延迟到手机醒来时
(屏幕可能还是关的)才做
• ELAPSED_REALTIME_WAKEUP:在多少 ms 后呼叫指定的 PendingIntent。若当时手机处于休眠,会唤醒手机
做事,同时休眠期间被延迟的事也会一起执行。是最常见的耗电凶手
• RTC:在指定的某段时间做事。若当时手机处于休眠,会延迟到手机醒来时 (屏幕可能还是关的)才做
• RTC_WAKEUP:在指定的某段时间做事。若当时手机处于休眠,会唤醒手机做事,同时休眠期间被延迟的事也
会一起执行。通常用于闹钟、记事提醒等

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIMEP,
SystemClock.elapsedRealtime() +
60 * 1000, alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
AlarmManager.INTERVAL_HALF_HOUR,
AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);

Alarm 的准时性
• 由于 ELAPSED_TIME 与 RTC 在手机休眠时不会唤醒手机,故一
定不准时
• 下表是针对 WAKEUP alarm 讨论
在这里插入图片描述

设计规范总结

  1. 尽可能减少在 AndroidManifest.xml 注册 receiver,以减少在后台的自启动与工作
  2. 若应用是登入账户、或是某种启用方式后才能使用主要功能,默认应关闭所有注册在
    AndroidManifest.xml 的 receiver,并在登入或启用功能后开启
<receiver android:name=“MyReceiver”
android:enabled=“false” />
ComponentName receiver = new ComponentName(context,
MyReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);

• 当用户退出或关闭应用功能后,应再以 setComponentEnabledSetting() 关闭 receiver

 尽 可 能 少 用 a l a r m 、 尤 其 是 W A K E U P a l a r m

  • 应 用 在 后 台 联 网 更 新 资 料 的 周 期 应 尽 可 能 拉 长 , 并 非 事 事 紧 急 需 立 即 知 会 用 户 。
    周 期 至 少 须 为 1 2 小 时 。 若 更 新 及 时 性 没 那 么 重 要 , 周 期 可 设 定 在 一 天 以 上

  • 若 用 户 进 了 应 用 刷 新 资 料 , 则 重 设 a l a r m 周 期 。 举 例 而 言 , 若 周 期 为 1 2 小 时 ,
    且 用 户 在 8 点 进 入 应 用 刷 新 资 料 , 则 下 次 在 后 台 更 新 资 料 的 时 间 为 2 0 点

  • 避 免 同 一 应 用 设 定 不 同 周 期 的 a l a r m 更 新 资 料

  • 除 了 闹 钟 、 记 事 提 醒 外 , 禁 止 使 用 WA K E U P a l a r m

  • 避 免 使 用 s e t E x a c t ( ) 、 s e t A l a r m C l o c k ( ) 、 s e t A n d A l l o w W h i l e I d l e ( ) 、
    s e t E x a c t A n d A l l o w W h i l e I d l e ( ) 这 种 对 时 间 高 精 准 要 求 的 接 口 。 使 用 其 他 接
    口 , 能 让 A l a r m M a n a g e r 适 度 调 整 时 间 , 节 省 功 耗
     避 免 与 服 务 器 建 立 长 连 接

  • 维 持 长 连 接 需 要 不 断 唤 醒 手 机 送 心 跳 包 。 若 有 许 多 应 用 与 服 务 器 建 立 长 连 接 ,
    对 手 机 待 机 耗 电 会 造 成 极 大 影 响

  • 在 还 没 设 计 出 R O M 里 的 共 用 p u s h 通 道 之 前 , 请 使 用 a l a r m 、 周 期 至 少 1 2
    小 时 、 且 不 是 WA K E U P a l a r m 的 方 式 , 向 服 务 器 更 新 资 料 。 若 用 户 进 了 应 用
    刷 新 资 料 , 则 重 设 a l a r m 周 期

  • 应 用 在 后 台 自 网 络 更 新 资 料 前 , 需 先 检 查 是 否 目 前 为
    B AT T E R Y _ L O W 。 若 处 于 B AT T E R Y _ L O W 、 且 目 前 不 是 充
    电 状 态 , 则 不 进 行 后 台 的 网 路 更 新 , 以 节 省 电 量

  • 应 用 内 的 手 动 刷 新 , 只 有 在 超 过 指 定 的 间 隔 时 间 , 才 从 网 络 更新 资 料
    服 务 器 更 新 资 料 未 必 那 么 频 繁 , 抓 到 的 可 能 都 是 同 样 资 料 。 故 即 使 用
    户 手 动 刷 新 资 料 , 也 不 应 每 次 真 的 自 网 络 更 新 。 只 要 判 断 相 邻 更 新 的
    间 隔 时 间 小 于 某 个 固 定 的 值 , 就 省 去 这 次 更 新

  • 使 用 p a r t i a l w a k e l o c k 需 设 定 t i m e o u t , 在 超 过 时 间 后
    自 动 释 放 w a k e l o c k
    此 规 定 是 为 了 避 免 程 序 逻 辑 错 误 , 造 成 w a ke l o c k 永 久 放 不 掉 的 耗电 问 题

联不上网的异常处理需合理:
• 应先检查目前手机网络连线状态,只有先确定连上 3G/4G 网络或 WiFi 时,
才进行连线

ConnectivityManager connectMgr =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectMgr.getActiveNetworkInfo();
if (info == null || !info.isConnected()) // 判断是否没连上网络
return;
// 执行应用联网相关代码

• 若当下连不上服务器,最多只能重试 3 次。之后就必须结束重试
• 避免在后台以监听 ConnectivityManager.CONNECTIVITY_ACTION
(android.net.conn.CONNECTIVITY_CHANGE) 广播方式进行联网重试。在网
络不稳定的环境,这个 intent 可能会送出非常频繁,若每次都做重新连线
的尝试,会造成明显的耗电
• 若应用会在后台定期联网,假设此次在后台连不上网,下次重试时间应该是
下个周期。避免再写另一个较短的周期进行后台联网重试

由 于 2 G ( G P R S 、 E d g e 、 C D M A ) 网 路 慢 , 容 易 传 输 很 久 造 成 功
耗 问 题 。 故 应 避 免 在 2 G 情 况 于 后 台 传 输 数 据

ConnectivityManager connectMgr =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectMgr.getActiveNetworkInfo();
if (info != null) {
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
// ...
} else if (info.getType() == ConnectivityManager.MOBILE) {
int subType = info.getSubtype();
if (subType == TelephonyManager.NETWORK_TYPE_CDMA
|| subType == TelephonyManager.NETWORK_TYPE_GPRS
|| subType == TelephonyManager.NETWORK_TYPE_EDGE) {
// 避免在后台传输数据
}
}
}

A c t i v i t y p a u s e 时 尽 可 能 释 放 耗 电 的 资 源 , 例 如 传 感 器 、 停
止 要 求 位 置 更 新 等 :

public void onResume() {
super.onResume();
SensorManager sManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
sManager.registerListener(mPositionListener,
mSensor, SensorManager.SENSOR_DELAY_GAME);
// ...
}
public void onPause() {
super.onPause();
SensorManager sManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
sManager.unregisterListener(mPositionListener);
}
  • 查 询 画 面 静 止 时 、 或 应 用 退 到 后 台 后 , 停 掉 后 台 不 必 要
    的 运 行
  • 按 h o m e 键 与 b a c k 键 离 开 皆 需 检 查
  • 以 t o p 命 令 检 查 C P U % ( 如 下 图 滴 滴 打 车 、 浏 览 器 、 今 日
    头 条 持 续 不 停 地 在 后 台 运 行 )

top -m 5 -d 1

在这里插入图片描述
 减 少 C P U 资 源 使 用

  • 滑 动 或 动 画
     应 用 退 到 后 台 ( 不 论 是 按 h o m e 或 b a c k 键 离 开 ) , 尽 可 能 呼 叫
    u n r e g i s t e r R e c i e v e r ( ) 或 u n r e g i s t e r C o n t e n t R e s o l v e r ( ) , 以 避 免
    在 后 台 收 到 频 繁 更 新 而 做 事 。 即 使 真 的 不 能 u n r e g i s t e r , 也 可 先 记 一 个
    f l a g 注 明 有 更 新 , 等 应 用 回 到 前 台 再 更 新 即 可
     避 免 动 画 循 环 不 停 地 播 放
     减 少 V i e w 的 b a c k g r o u n d 使 用 , 特 别 是 不 明 显 的 b a c k g r o u n d 。 增
    加 性 能 、 也 减 少 功 耗

广播和跨进程通信组件
一 . 广 播 发 送 方 式 有 两 类 :
1 . 并 行 发 送 — — P a r a l l e l — — s e n d B r o a d c a s t
2 . 串 行 发 送 — — O r d e r e d — — s e n d O r d e r e d B r o a d c a s t
二 . 广 播 注 册 方 式 有 两 种 :
1 . 在 A n d r o i d M a n i f e s t . x m l 中 加 r e c e i v e r 静 态 注 册
2 . P M
3 . 在 代 码 中 用 r e g i s t e r R e c e i v e r 动 态 注 册 — — A M

并行广播
在这里插入图片描述
•尽量在代码中动态注册广播
例:ACTION_PACKAGE_ADDED
ACTION_PACKAGE_REMOVED
ACTION_PACKAGE_CHANGED
•尽量避免注册有序广播
在这里插入图片描述
前台广播

  • 广 播 有 两 个 队 列 — — f o r e g r o u n d 、 b a c k g r o u n d
  • 广 播 发 送 者 可 以 选 择 在 哪 个 队 列 发 送 广 播

在这里插入图片描述
•前台广播的影响——CPU调度组
ActivityManagerService中computeOomAdjLocked
在这里插入图片描述
一个app在接收广播时,它的adj会调整为foreground;
如果接收的是前台广播其调度组也会变成foreground

并行广播

自 定 义 广 播 原 则 上 禁 止 以F L A G _ R E C E I V E R _ F O R E G R O U N D 标
志 发 送

广播收发范围

  • 广 播 发 送 者 可 以 限 定 接 收 者 的 范 围 :
  • 定 向 广 播 — — e x p l i c i t i n t e n t
  • 仅 动 态 注 册 接 收 ( 如 : A C T I O N _ T I M E _ T I C K )
    例:Launcher向某个widget的包发广播,指定Component

在这里插入图片描述

广播收发范围
•广播接收者可以限定接收的广播的范围
如何做到只监听特定包被安装/卸载了?

在这里插入图片描述
SSP过滤效果
过滤效果也可以在代码中实现,上面一个例子可以这样写:

IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addDataScheme("package");
filter.addDataSchemeSpecificPart(“com.lxm.broadcasttestreceiver",
PatternMatcher.PATTERN_PREFIX);

在这里插入图片描述

广播收发范围
•LocalBroadcastManager可用于同进程内广播
在这里插入图片描述
广 播 的 作 用 范 围 要 尽 量 的 小

  • 跨 进 程 的 能 通 过 过 滤 条 件 减 小 范 围 的 就 减 小
  • 只 有 一 个 跨 进 程 的 收 听 者 应 发 定 向 广 播
  • 同 一 个 进 程 内 的 应 用 L o c a l B r o a d c a s t M a n a g e r

在这里插入图片描述

跨进程通信组件
•ContentResolve提供了一种可扩展的调用方式
call,可以用来进行进程间通信
在这里插入图片描述
•1、注册广播时,尽量在代码中动态注册
•2、要尽量避免使用ACTION_BOOT_COMPLETED之类的有序广

•3、禁止以FLAG_RECEIVER_FOREGROUND标记的方式发广播
•4、跨进程广播要尽量减小范围;点对点的广播要指明
Component;进程内通信可以采用LocalBroadcastManager
•5、跨进程频繁通信要避免使用广播,可以用bindService或
ContentResolver.call

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值