使设备保持唤醒状态

为避免消耗电池电量,处于空闲状态的 Android 设备会快速进入休眠模式。不过,有时应用需要唤醒屏幕或 CPU 并使其保持唤醒状态,以完成某项工作。

您采用的方法取决于应用的需求。不过,一般而言,您应该为应用使用尽可能轻量的方法,以最大限度减少应用对系统资源的影响。以下部分介绍了如何处理设备的默认休眠行为不符合应用要求的情况。

使用唤醒锁定的替代方案

在为您的应用添加唤醒锁定支持之前,请考虑应用的用例是否支持以下某种替代解决方案:

  • 如果您的应用执行长时间运行的 HTTP 下载,请考虑使用 DownloadManager

  • 如果您的应用同步来自外部服务器的数据,请考虑创建同步适配器

  • 如果您的应用依赖于后台服务,请考虑使用 JobSchedulerFirebase Cloud Messaging,以便以特定的时间间隔触发这些服务。

  • 如果您需要让配套应用在范围内时保持运行状态,请使用配套设备管理器

使屏幕保持开启状态

某些应用需要使屏幕保持开启状态,例如游戏或电影应用。为此,最好的方法是在您的 activity 中使用 FLAG_KEEP_SCREEN_ON(仅在 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。您可以使用最适合您的应用的任何方法。在 activity 中以编程方式设置该标志的优势在于,您可以选择稍后以编程方式清除该标志,从而允许屏幕关闭。

电视的氛围模式

在电视上,应使用 FLAG_KEEP_SCREEN_ON 来防止设备在正在播放视频期间进入氛围模式。如果前台 activity 未设置 FLAG_KEEP_SCREEN_ON,设备会在闲置一段时间后自动进入氛围模式。

使 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 的声明。请务必在应用使用完唤醒锁定后立即将其释放,以避免过度消耗电量。