我正在寻找一个Android手表的代码示例,它使用AlarmManager类在环境模式下更新面部。
请提供链接或代码。
谢谢。
答案 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
}
}
查看完整指南的链接。