android-wear watch 使用 AlarmManager 在环境模式下更新的代码示例?

Code example for android-wear watch using AlarmManager to update in ambient mode?

我正在寻找 android 手表的代码示例,该手表使用 AlarmManager class 在环境模式下更新面部。

请提供 link 或过去的代码。

谢谢。

我正在寻找 android 手表的代码示例,该手表使用 AlarmManager class 在环境模式下更新面部。

您正在寻找的是 Update more frequently Android 佩戴指南。

准备报警管理器 警报管理器启动更新屏幕并安排下一个警报的未决意图。以下示例显示了如何在 activity:

的 onCreate() 方法中声明警报管理器和未决意图
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);
    ...
}

更新屏幕并安排数据更新 在此示例 activity 中,警报管理器在环境模式下每 20 秒触发一次。当计时器滴答作响时,闹钟触发更新屏幕的意图,然后设置下一次更新的延迟。

以下示例显示如何更新屏幕上的信息并设置下次更新的警报:

// 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
    }
}

查看 link 以获得完整指南。

我开发了一个 Android 表盘,它也需要 运行 定期(例如每小时)的方法。起初,处理程序似乎是一个很好的解决方案,但当 Android Wear 设备进入睡眠状态时它会停止工作。然后,我看到了文章 Keeping Your App Visible 和部分 "Update Content in Ambient Mode"。然而,要理解它如何应用于表盘并不是那么容易。此处描述的解决方案是在表盘上启用定期更新,即使 Android Wear 设备进入睡眠状态。

首先将以下字段添加到您的表盘:

/**
 * Action for the update in ambient mode, per our custom refresh cycle.
 */
private static final String UPDATE_ACTION = "your.package.action.UPDATE";
/**
 * Milliseconds between waking processor/screen for updates
 */
private static final long UPDATE_RATE = TimeUnit.MINUTES.toMillis(30);
private AlarmManager mUpdateAlarmManager;
private PendingIntent mUpdatePendingIntent;
private BroadcastReceiver mUpdateBroadcastReceiver;

在此示例中,每 30 分钟更新一次。为了节省电池电量,大多数穿戴式应用程序在微光模式下不应频繁更新屏幕。频繁更新对电池电量有很大影响。

这是 onCreateEngine() 方法在我的表盘上的样子:

@Override
public Engine onCreateEngine() {

    /* Set an AlarmManager. The AlarmManager calls itself again in the end for a periodic update. */
    mUpdateAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent ambientUpdateIntent = new Intent(UPDATE_ACTION);

    mUpdatePendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, ambientUpdateIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    mUpdateBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(this.getClass().getName(), "Broadcast received!");
            doMyUpdateAndScheduleNewUpdate();
        }
    };
    IntentFilter filter = new IntentFilter(UPDATE_ACTION);
    registerReceiver(mUpdateBroadcastReceiver, filter);

    doMyUpdateAndScheduleNewUpdate();

    return new Engine();
}

doMyUpdateAndScheduleNewUpdate() 是定期执行您想做的任何事情的方法。在该方法中还调用了 scheduleNewAlarm() - 这非常重要,因为它是安排后续警报的方法。它应该是这样的:

/**
 * Schedule the next alarm that will call onReceive of the BroadcastReceiver.
 */
private void scheduleNewAlarm() {
    // Calculate the next trigger time
    long triggerTimeMs = System.currentTimeMillis() + UPDATE_RATE;
    mUpdateAlarmManager.setExact(
            AlarmManager.RTC_WAKEUP,
            triggerTimeMs,
            mUpdatePendingIntent);
}

最后,重写 WatchFaceService 的 onDestroy 方法,该方法在服务即将消失之前调用。在那里,我们要取消更新 Intent 并注销广播接收器。基本上,添加此代码:

@Override
public void onDestroy() {
    // take care of the AlarmManager periodic update
    mUpdateAlarmManager.cancel(mUpdatePendingIntent);
    unregisterReceiver(mUpdateBroadcastReceiver);
    super.onDestroy();
}