为避免消耗电池电量,处于空闲状态的 Android 设备会快速掉落 睡着了。不过,有时应用需要唤醒屏幕 或 CPU,并使其保持唤醒状态以完成某项工作。
具体采用何种方法取决于应用的需求。不过,一般而言, 应尽可能使用最简便的方法 应用,以尽可能降低应用对系统资源的影响。以下部分 介绍了如何处理设备默认休眠行为 不符合应用要求
使用唤醒锁定的替代方案
在为您的应用添加唤醒锁定支持之前,请考虑您的应用是否会使用 个案支持下列替代解决方案之一:
如果您的应用执行长时间运行的 HTTP 下载,请考虑使用
DownloadManager
。如果您的应用同步了来自外部服务器的数据,不妨考虑创建一个 同步适配器。
如果您的应用依赖于后台服务,请考虑使用 JobScheduler 或 Firebase Cloud Messaging 以特定的时间间隔触发这些服务。
如果您需要让配套应用在每次配套设备时都保持运行状态 请使用配套设备管理器。
使屏幕保持开启状态
某些应用需要使屏幕保持开启状态,例如游戏或电影应用。通过
最好的方法是使用
FLAG_KEEP_SCREEN_ON
在您的 activity 中(且只能在 activity 中,绝不会在服务或其他应用中)
组件)。例如:
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
这种方法的优势在于,与唤醒锁定(详见保持 CPU 运行),它不需要特殊权限,而且平台 正确管理用户在不同应用之间的移动,而无需您的应用 不要担心释放未使用的资源
实现此目标的另一种方法是在应用的布局 XML 文件中,使用
android:keepScreenOn
属性:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
使用 android:keepScreenOn="true"
等同于使用
FLAG_KEEP_SCREEN_ON
。
您可以使用最适合您的应用的任何方法。通过设置
在您的活动中以编程方式使用该标志
稍后以编程方式清除标志,从而允许屏幕翻转
关闭。
电视氛围模式
在电视上,
FLAG_KEEP_SCREEN_ON
来防止设备进入
氛围模式
。如果未设置 FLAG_KEEP_SCREEN_ON
被前台 activity 触发后,设备会自动进入氛围模式
。
使 CPU 保持运行状态
如果您需要使 CPU 保持运行状态,以便在
设备进入休眠状态,您就可以使用
PowerManager
系统服务功能
称为唤醒锁定唤醒锁定可让应用控制电源状态
主机设备的位置。
创建和持有唤醒锁定会对主机设备的
电池寿命。因此,只有在绝对必要时,才应使用唤醒锁定。
并保持它们的最短时间例如,在任何情况下,您都不应该
在 activity 中使用唤醒锁定。如上所述,如果您希望保留
在 activity 中开启屏幕,请使用
FLAG_KEEP_SCREEN_ON
。
使用唤醒锁定的一种合理情形是,后台服务 需要获取唤醒锁定,以使 CPU 在屏幕处于活跃状态时保持运行状态 关闭。再次强调,由于这种做法的影响 电池寿命。
要使用唤醒锁定,首先要在
WAKE_LOCK
权限:
应用的清单文件:
<uses-permission android:name="android.permission.WAKE_LOCK" />
如果您的应用包含使用服务执行某些工作的广播接收器, 下面介绍了如何直接设置唤醒锁定:
Kotlin
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Java
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
要释放唤醒锁定,请调用
wakelock.release()
。
这会释放您对 CPU 的声明。请务必将唤醒锁定
避免过度耗电。