我正在寻找使用 AlarmManager 类在环境模式下更新面部的 android 手表的代码示例。
请提供链接或过去的代码。
谢谢你。
我正在寻找使用 AlarmManager 类在环境模式下更新面部的 android 手表的代码示例。
请提供链接或过去的代码。
谢谢你。
我开发了一个 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();
}
我正在寻找使用 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
}
}
查看完整指南的链接。