【问题标题】:unregistering broadcast receivers on screen off for better battery life在屏幕上注销广播接收器以延长电池寿命
【发布时间】:2011-03-27 10:41:05
【问题描述】:

我正在制作一个仅在屏幕打开时才处于活动状态的 android 小部件,以延长电池寿命。所以我有一项服务一直在运行并对 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF 做出反应。当屏幕关闭时,我取消注册其他广播接收器,当屏幕打开时,我再次注册它们。

我的问题是,当屏幕关闭时,关于电池寿命的最佳做法是什么。删除广播接收器变量(即 m_Receiver = null;)是否更好,或者取消注册就足够了?删除意味着系统有更多的可用内存,但会导致垃圾收集和额外的内存操作(当屏幕打开时我必须创建一个新的接收器),这些操作很昂贵......

【问题讨论】:

    标签: android broadcastreceiver battery


    【解决方案1】:

    我正在制作一个仅在屏幕打开时才处于活动状态的 android 小部件,以延长电池寿命。

    首先,我假设“小部件”是指“应用小部件”。

    其次,应用小部件永远不会“活跃”。

    所以我有一项服务一直在运行并对 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF 做出反应。

    这不是一个好主意。首先,保留进程会浪费数兆字节的 RAM。其次,它不会工作,因为Android不会让服务“一直运行”——它最终会关闭你的服务。第三,用户对像您这样一直在运行服务的开发人员感到恼火,因此他们会使用任务杀手(Android 2.1 及以下版本)或设置应用程序中的管理服务屏幕(Android 2.0 及更高版本)来终止您的服务)。

    当屏幕关闭时,我取消注册其他广播接收器,当屏幕打开时,我再次注册它们。

    我不知道“其他广播接收器”是什么。他们可能一开始就不应该注册。

    我的问题是,当屏幕关闭时,关于电池寿命的最佳做法是什么。还是删除广播接收器变量(即 m_Receiver = null;)更好还是取消注册就足够了?删除意味着系统有更多的可用内存,但会导致垃圾收集和额外的内存操作(当屏幕打开时我必须创建一个新的接收器),这些操作很昂贵......

    考虑到服务占用了多少内存,担心这一点毫无意义。专注于摆脱永恒的服务。

    例如,假设此应用小部件正在显示电池电量。没有一个永恒的服务正在观看ACTION_BATTERY_CHANGED。相反,让用户选择一个轮询周期(例如,每五分钟一次)并使用AlarmManager 定期检查电池电量。

    【讨论】:

    • 它只是一个小部件,没有应用程序。我正在学习 android 编程,作为第一个小项目,我正在开发一个电池小部件,因此我根据屏幕状态注册/取消注册 ACTION_BATTERY_CHANGED。
    • @shelll:“它只是一个小部件,没有应用程序”——这是不正确的。首先,请正确使用术语。主屏幕的交互元素各自称为“应用小部件”。 “小部件”是ButtonCheckBox 等。其次,您在 Android 上安装的任何东西都是应用程序。 “所以我根据屏幕状态注册/取消注册 ACTION_BATTERY_CHANGED”——请不要一直运行服务。请使用AlarmManager定期检查电池状态。
    • @shelll:要在没有BroadcastReceiver 的情况下检查电池状态,请使用null 第一个参数调用registerReceiver(),并为ACTION_BATTERY_CHANGED 调用第二个参数IntentFilter。由于ACTION_BATTERY_CHANGED 是一个粘性广播,所以registerReceiver() 的返回值将是最后一次广播的电池状态。从Intent extras 中读取值并更新应用小部件的RemoteViews。从由AlarmManager 触发的清单注册BroadcastReceiver 执行此操作。
    • @CommonsWare:我以前的回复有问题,不知道如何制作新段落,我的编辑时间超过了允许的限制。更多信息:我认为警报会被触发更多次,然后 ACTION_BATTERY_CHANGED,它仍然是更好的方法吗? “报警方式”不会一直显示精确的电池状态(例如充电状态),用户可以投诉。如果你说它在电池寿命和用户幸福感方面更好,我会用闹钟替换接收器。还有一个问题。我将 updatePeriodMillis 设置为零并在构造函数中启动警报,这不会唤醒手机?
    • @shelll:“我认为警报会被触发更多次,然后是 ACTION_BATTERY_CHANGED”——或者更少次,具体取决于用户配置。 “‘报警方式’不会一直显示精确的电池状态(例如充电状态),用户可以抱怨”——可以想象,但那是因为他们不需要你的应用小部件,因为已经有 很多 i> 他们确定电池电量和充电状态的其他方式。 “不会唤醒手机”——使用没有_WAKEUP的闹钟类型,它不会唤醒手机。
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多