使设备保持唤醒状态

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

具体采用何种方法取决于应用的需求。不过,一般而言, 应尽可能使用最简便的方法 应用,以尽可能降低应用对系统资源的影响。以下部分 介绍了如何处理设备默认休眠行为 不符合应用要求

使用唤醒锁定的替代方案

在为您的应用添加唤醒锁定支持之前,请考虑您的应用是否会使用 个案支持下列替代解决方案之一:

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

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

  • 如果您的应用依赖于后台服务,请考虑使用 JobSchedulerFirebase 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 的声明。请务必将唤醒锁定 避免过度耗电。