Пример кода для Android-часов с использованием AlarmManager для обновления в режиме окружающей среды?

Я ищу пример кода для часов Android, который использует класс AlarmManager для обновления лица в фоновом режиме.

Пожалуйста, дайте ссылку или вставьте код.

Спасибо.


person kjl    schedule 09.07.2016    source источник


Ответы (2)


Я разработал циферблат для 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();
}
person DarkScrolls    schedule 20.11.2017

Я ищу пример кода для часов 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
    }
}

Проверьте ссылку для полного руководства.

person noogui    schedule 26.07.2016
comment
Этот код, похоже, предназначен для приложения Android Wear, а не для часов. - person kjl; 27.07.2016
comment
Android-часы - это одежда для Android. Вы видели часть «isAmbient()»? это для андроид часов. Читайте также ссылки - person noogui; 27.07.2016
comment
насколько я могу судить, метод тестирования внешнего режима для службы часов isInAmbientMode() - person kjl; 27.07.2016
comment
Они оба. isAmbient() принадлежит WearableActivity класс, в то время как isInAmbientMode() принадлежит WatchFaceService .Engine класс. - person noogui; 27.07.2016
comment
в яблочко. Я ищу код, который показывает, как применить AlarmManager к классу WatchFaceServiceEngine. Я встречал примеры для носимых приложений. Я ищу пример, относящийся к коду для циферблата. Если бы вы могли рассказать мне, как настроить код для работы на циферблате, или показать мне ссылку на пример кода, который работает на циферблате, это очень помогло бы мне. - person kjl; 27.07.2016
comment
Я думаю, вы решили свою проблему в этом Тема ТАК - person noogui; 28.07.2016
comment
Почти на месте. Мне еще предстоит выяснить, как настроить и использовать будильники. - person kjl; 28.07.2016