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

时间:2016-07-09 21:01:30

标签: android-studio alarmmanager wear-os watch-face-api

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

请提供链接或代码。

谢谢。

2 个答案:

答案 0 :(得分:1)

我开发了一个Android表盘,也需要定期运行一个方法(例如每小时)。起初,处理程序似乎是一个很好的解决方案,但是当Android Wear设备进入睡眠状态时它会停止工作。然后,我看到了文章Keeping Your App Visible和#34;以环境模式更新内容"部分。然而,要理解它如何适用于表盘并不容易。此处描述的解决方案即使在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();
}

答案 1 :(得分:0)

我正在寻找一个Android手表的代码示例,它使用AlarmManager类在环境模式下更新脸部。

您正在寻找的是Update more frequently 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
    }
}

查看完整指南的链接。