Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

保持应用可见

某些 Wear 应用在对用户始终可见时作用最大。例如,在室外跑步的用户看一眼自己的穿戴式设备,就能了解跑步距离和所用时间;或者只需在其穿戴式设备上录入购物清单,就能在市场购物时快速了解还有哪些商品没有购买。让应用始终可见对电池续航时间有影响,因此在为应用添加这项功能时,您应该仔细考虑这种影响。

运行 Android 5.1 或更高版本的 Android Wear 设备允许应用在节省电池电量的同时保持前台运行。Android Wear 应用可以控制穿戴式设备在低功耗微光模式下运行时屏幕上的显示内容。同时运行在微光和交互模式下的 Wear 应用称作始终开启应用。

本课程介绍如何让您的穿戴式设备应用始终开启,如何在微光模式下更新屏幕,以及如何保持后向兼容性。

在穿戴式设备应用中启用微光模式

对于新项目和现有项目,您可以通过更新开发项目配置向 Wear 应用添加微光模式支持。在您完成项目配置后,扩展 WearableActivity 类,该类提供了在应用中启用微光模式所需的全部函数。下文将详细介绍这些步骤。

配置您的开发项目

要在 Wear 应用中支持微光模式,您必须更新 Android SDK 并配置您的开发项目。请按以下步骤做出必要的更改:

  • 更新您的 SDK,使其包括 Android 5.1 (API 22) 或更高版本平台,后者提供的 API 可让 Activity 转入微光模式。如需了解有关如何更新 SDK 的详细信息,请参阅添加 SDK 软件包
  • 创建一个项目或修改现有项目,使其以 Android 5.1 或更高版本为目标平台。这意味着,您必须将清单 targetSdkVersion 设置为 22 或更高。
  • 如果您想在低于 Android 5.1 的版本上支持设备,请将 manifest minSdkVersion 设置为 20 或更高。如需了解有关后向兼容性的详细信息,请参阅保持后向兼容性
  • 向您的 build.gradle 文件添加或更新下列依赖项:
    dependencies {
        ...
        compile 'com.google.android.support:wearable:1.2.0'
        provided 'com.google.android.wearable:wearable:1.0.0'
    }
    

    provided 依赖项可确保为支持微光模式而在运行时加载的类在编译时同样可用。

  • 向穿戴式设备应用 manifest 添加穿戴式设备共享库条目:
    <application>
      <uses-library android:name="com.google.android.wearable"
                    android:required="false" />
      ...
    </application>
    
  • 向手持式和穿戴式设备应用 manifest 添加 WAKE_LOCK 权限:
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

创建一个支持微光模式的 Activity

要在您的 Activity 中启用微光模式,请使用 WearableActivity 类和函数。

  1. 创建一个用于扩展 WearableActivity 的 Activity。
  2. 在您的 Activity 的 onCreate() 函数中,调用 setAmbientEnabled() 函数。

按下述方法在您的 Activity 中启用微光模式:

public class MainActivity extends WearableActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setAmbientEnabled();
    ...
}

处理模式之间的转换

如果在应用显示期间用户在一段时间内未与应用进行交互,或者如果用户用手掌遮住屏幕,系统会将 Activity 切换至微光模式。在应用切换至微光模式后,将 Activity 界面更新为更基本的布局以降低功耗。您应该使用黑色背景以及最简白色图形和文本。为了让用户能够从交互模式轻松转换到微光模式,请尽量让屏幕上的项目保持类似布局。如需了解有关在微光屏幕上呈现内容的详细信息,请参阅 Android Wear 表盘设计指南。

请注意,如果运行应用的设备没有硬件按钮,用手掌遮住屏幕无法将应用切换到微光模式,而会导致应用退出并显示主屏幕。此行为旨在确保用户可以妥善地退出应用。不过,如果屏幕超时,这些设备仍会转入微光模式。

:在微光模式下,停用屏幕上的所有交互元素,例如按钮。如需了解有关如何为始终开启应用设计用户交互的详细信息,请参阅 Android Wear 应用结构设计指南。

当 Activity 切换到微光模式时,系统会调用您的穿戴式设备 Activity 中的 onEnterAmbient() 函数。下面这段代码展示了如何在系统切换至微光模式后将文本颜色更改为白色并停用抗锯齿:

@Override
public void onEnterAmbient(Bundle ambientDetails) {
    super.onEnterAmbient(ambientDetails);

    mStateTextView.setTextColor(Color.WHITE);
    mStateTextView.getPaint().setAntiAlias(false);
}

当用户点按屏幕或抬起手腕时,Activity 会从微光模式切换至交互模式。系统会调用 onExitAmbient() 函数。重写该函数以更新界面布局,让您的应用在全彩、交互状态下显示。

下面这段代码展示了如何在系统切换至交互模式后将文本颜色更改为绿色并启用抗锯齿:

@Override
public void onExitAmbient() {
    super.onExitAmbient();

    mStateTextView.setTextColor(Color.GREEN);
    mStateTextView.getPaint().setAntiAlias(true);
}

在微光模式下更新内容

微光模式允许您用提供给用户的新信息更新屏幕,但您必须小心地在显示更新与电池续航时间之间保持平衡。您绝对应该考虑只重写 onUpdateAmbient() 函数,以在微光模式下每分钟更新一次屏幕。如果您的应用需要更频繁的更新,请考虑电池续航时间与更新频率之间的取舍。要节约电池电量,更新频率不应高于每 10 秒一次。但实际上,您更新应用的频率应小于该值。

每分钟更新一次

为节约电池电量,大多数 Wear 应用不应在微光模式下频繁地更新屏幕。我们建议将您的应用设计为在该模式下每分钟更新一次屏幕。系统提供了一个回调函数 onUpdateAmbient(),用于按此建议频率更新屏幕。

要更新您的应用内容,请在您的穿戴式设备 Activity 中重写 onUpdateAmbient() 函数:

@Override
public void onUpdateAmbient() {
    super.onUpdateAmbient();

    // Update the content
}

更频繁地更新

对于需要更频繁更新的应用,例如健身、计时和旅行信息应用,请使用 AlarmManager 对象来唤醒处理器并更频繁地更新屏幕。

要实现在微光模式下更频繁更新内容的闹铃,请按以下步骤操作:

  1. 准备闹铃管理器。
  2. 设置更新的频率。
  3. 当 Activity 切换至微光模式或当前处于微光模式时安排下一次更新。
  4. 当 Activity 切换至交互模式或 Activity 停止时取消闹铃

:闹铃管理器可能会在触发时创建新的 Activity 实例。为防止出现这种情况,请确保在 manifest 中使用 android:launchMode="singleInstance" 参数声明您的 Activity。

下文将详细介绍这些步骤。

准备闹铃管理器

闹铃管理器启动一个挂起 intent,后者更新屏幕并安排下一次闹铃。下例显示了如何在您的 Activity 的 onCreate() 函数中声明闹铃管理器和挂起 intent:

private AlarmManager mAmbientStateAlarmManager;
private PendingIntent mAmbientStatePendingIntent;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setAmbientEnabled();

    mAmbientStateAlarmManager =
        (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent ambientStateIntent =
        new Intent(getApplicationContext(), MainActivity.class);

    mAmbientStatePendingIntent = PendingIntent.getActivity(
        getApplicationContext(),
        0,
        ambientStateIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);
    ...
}

当闹铃触发并启动挂起 intent 时,后者通过重写 onNewIntent() 函数更新屏幕并安排下一次闹铃:

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);

    // Described in the following section
    refreshDisplayAndSetNextUpdate();
}

更新屏幕并安排数据更新

在该示例 Activity 中,闹铃管理器在微光模式下每 20 秒触发一次。如果计时器开始计时,闹铃会触发 intent,后者更新屏幕,然后设置下次更新的延迟。

下例显示了如何在屏幕上更新信息以及为下次更新设置闹铃:

// Milliseconds between waking processor/screen for updates
private static final long AMBIENT_INTERVAL_MS = TimeUnit.SECONDS.toMillis(20);

private void refreshDisplayAndSetNextUpdate() {

    if (isAmbient()) {
        // Implement data retrieval and update the screen for ambient mode
    } else {
        // Implement data retrieval and update the screen for interactive mode
    }

    long timeMs = System.currentTimeMillis();

    // Schedule a new alarm
    if (isAmbient()) {
        // Calculate the next trigger time
        long delayMs = AMBIENT_INTERVAL_MS - (timeMs % AMBIENT_INTERVAL_MS);
        long triggerTimeMs = timeMs + delayMs;

        mAmbientStateAlarmManager.setExact(
            AlarmManager.RTC_WAKEUP,
            triggerTimeMs,
            mAmbientStatePendingIntent);

    } else {
        // Calculate the next trigger time for interactive mode
    }
}

安排下一次闹铃

通过重写 onEnterAmbient() 函数和 onUpdateAmbient() 函数,安排闹铃在 Activity 进入微光模式或 Activity 已处于微光模式时更新屏幕:

@Override
public void onEnterAmbient(Bundle ambientDetails) {
    super.onEnterAmbient(ambientDetails);

    refreshDisplayAndSetNextUpdate();
}

@Override
public void onUpdateAmbient() {
    super.onUpdateAmbient();

    refreshDisplayAndSetNextUpdate();
}

:在本例中,每当需要更新屏幕时,就会调用 refreshDisplayAndSetNextUpdate() 函数。如需查看关于何时调用该函数的更多示例,请参阅 AlwaysOn 示例。

取消闹铃

当设备切换至交互模式时,在 onExitAmbient() 函数中取消闹铃:

@Override
public void onExitAmbient() {
    super.onExitAmbient();

    mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);
}

当用户退出或停止您的 Activity 时,在 Activity 的 onDestroy() 函数中取消闹铃:

@Override
public void onDestroy() {
    mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);
    super.onDestroy();
}

保持后向兼容性

支持微光模式的 Activity 在运行的 Android 版本低于 5.1(API 级别 22)的 Wear 设备上会自动回退为普通 Activity。在这些版本的 Android 上,无需为支持设备而编写专门的应用代码。当设备切换至微光模式时,会返回主屏幕并退出您的 Activity。

如果您的应用不应在运行 5.1 以下版本 Android 的设备上安装或更新,请使用以下代码更新您的 manifest:

<uses-library android:name="com.google.android.wearable" android:required="true" />