1

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

请提供链接或过去的代码。

谢谢你。

4

2 回答 2

1

我开发了一个 Android 表盘,它还需要定期(例如每小时)运行一个方法。起初,处理程序似乎是一个很好的解决方案,但当 Android Wear 设备进入睡眠状态时,它就会停止工作。然后,我看到了让您的应用程序可见的文章和“在环境模式下更新内容”部分。但是,要理解它如何应用于表盘并不容易。此处描述的解决方案是在表盘上启用定期更新,即使在 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();
}
于 2017-11-20T22:14:59.927 回答
0

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

您正在寻找的是更频繁地更新Android Wear 指南。

准备警报管理器 警报管理器启动一个挂起的意图,更新屏幕并安排下一个警报。以下示例显示了如何在活动的 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);
    ...
}

更新屏幕和计划数据更新 在此示例活动中,警报管理器在环境模式下每 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
    }
}

查看完整指南的链接。

于 2016-07-26T07:44:29.640 回答