Я ищу пример кода для часов Android, который использует класс AlarmManager для обновления лица в фоновом режиме.
Пожалуйста, дайте ссылку или вставьте код.
Спасибо.
Я ищу пример кода для часов Android, который использует класс AlarmManager для обновления лица в фоновом режиме.
Пожалуйста, дайте ссылку или вставьте код.
Спасибо.
Я разработал циферблат для Android, который также должен периодически запускать метод (например, каждый час). Сначала обработчик казался хорошим решением, но он перестает работать, когда устройство Android Wear переходит в спящий режим. Затем я наткнулся на статью Как сделать ваше приложение видимым. и раздел «Обновление контента в 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);
}
Наконец, переопределите метод onDestroy вашего WatchFaceService, который вызывается непосредственно перед уходом службы. Там мы хотим отменить намерение обновления и отменить регистрацию широковещательного приемника. В общем, добавьте этот код:
@Override
public void onDestroy() {
// take care of the AlarmManager periodic update
mUpdateAlarmManager.cancel(mUpdatePendingIntent);
unregisterReceiver(mUpdateBroadcastReceiver);
super.onDestroy();
}
Я ищу пример кода для часов Android, использующих класс AlarmManager для обновления циферблата в фоновом режиме.
Вам нужно обновлять чаще Android. Руководство по ношению.
Подготовка диспетчера аварийных сигналов Менеджер аварийных сигналов запускает отложенное намерение, которое обновляет экран и планирует следующий аварийный сигнал. В следующем примере показано, как объявить менеджер сигналов тревоги и ожидаемое намерение в методе 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
}
}
Проверьте ссылку для полного руководства.