Получение информации о состоянии синхронизации с помощью SyncStatusObserver или другими способами? - PullRequest
0 голосов
/ 27 августа 2011

Если говорить конкретно, у меня есть «Droid HTC incredible, Android версия 2.2, Baseband 2.15.00.07.28, ядро ​​2.6.32.17-g9a2fe16, сборка 3.26.605.1, номер программного обеспечения 3.26.605.1

I»Eclipse и Android SDK установлены и работают нормально.Приятно, как я могу отлаживать и выполнять пошаговый код на моем Droid в Eclipse.

Я прочитал несколько книг и попробовал все примеры на практике, и я опираюсь на несколько лет разработки программного обеспеченияопыт (> 10 лет) в других объектно-ориентированных языках, включая C ++, но не в Java, но я довольно быстро его подхватываю.

Я также скачал, как мне кажется, версию исходного кода.код, запущенный на моем Droid, запускающем repo / git, и я копался в коде пакетов / apps / AccountsAndSyncSettings FRG83G / src / com / android / settings.

Сейчас.Я хочу написать небольшое приложение, которое сообщит мне, когда произойдет сбой синхронизации.Царапина, которую я пытаюсь уловить, состоит в том, что после того, как я сделал большое количество изменений, используя интерфейс контактов GMail (например), и «Droid не может их синхронизировать (возможно, слишком много удаляет?)Поэтому, когда синхронизация постоянно происходит сбой, я хочу отобразить значок панели уведомлений, чтобы сообщить мне об этой ошибке синхронизации.Без такого приложения первое указание на то, что оно перестало работать, - это когда я замечаю пропущенную контактную информацию, возможно, через 2-3 дня.

Итак, логика может показывать, что мое маленькое приложение должно быть SyncStatusObserver длябыть информированным, когда действие синхронизации меняет статус, затем получить SyncStatusInfo для этой синхронизации и отметить, какая синхронизация не удалась и когда.Из того, что я могу собрать, это означает реализацию SyncStatusObserver и подключение его к трансляции с вызовом ContentResolver.addStatusChangeListener.Я реализовал это и вижу уведомления.

Мне кажется, я понимаю, что объектная модель в том, что Тип учетной записи имеет ноль для многих учетных записей, и что каждая учетная запись обозначает тип данных, которыевыполняется синхронизация (контакты и календарь и т. д.).

Единственный метод SyncStatusObserver, onStatusChanged (final int which), имеет параметр int which, который, по-видимому, пытается указать, какой тип учетной записи иликакие учетные записи только что изменили его статус синхронизации.Я написал и соединил это и получаю эти вызовы методов, как и следовало ожидать, когда тип данных синхронизирован.Я наблюдал это в окне ведения журнала отладчика Eclipse во время выполнения моего приложения.

Мой вопрос заключается в том, как связать единственное целое значение типа int с типом учетной записи и / или полномочиями учетной записи?Я хотел бы вызвать SyncInfo getCurrentSync () и записать учетную запись, полномочия и время начала.(Почему время начала? Разве нам не нужны время окончания и состояние завершения?)

Поиск здесь по stackoverflow, я нахожу в сообщении Как можно прослушать прогресс из Android SyncAdapter? что SyncStatusObserver довольно бесполезен, поскольку он не передает очень много полезной информации с помощью одного целочисленного параметра.Ой.ОК.

Я думаю, что есть еще один способ взглянуть на этот вопрос: на HTC Incredible, когда вы находитесь на главном экране и выбираете Меню -> Настройки -> Аккаунты и синхронизация -> Google (учетная запись в списке), пользовательский интерфейс показывает в последний раз, когда каждый тип учетной записи учетной записи GMail был успешно синхронизирован.Где находится код, который получает эту информацию, а также ту же информацию, что и я, и я хочу получать эту информацию после каждого вызова метода SyncStatusObserver onStatusChanged.

При публикации Дата последнего обновления Syncadapter Что в основном говорит о том, что последняя дата / время синхронизации не отображается текущим кодом Droid.

Есть ли какой-либо другой способ получения последней успешной даты / времени синхронизации для каждого из SyncAdators?Я очень хочу почесать свой зуд (так сказать).

1 Ответ

1 голос
/ 23 июля 2012
private final SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
    @Override
    public void onStatusChanged(int which) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String accountName = AccountUtils.getChosenAccountName(HomeActivity.this);
                if (TextUtils.isEmpty(accountName)) {
                    setRefreshActionButtonState(false);
                    return;
                }

                Account account = new Account(accountName, GoogleAccountManager.ACCOUNT_TYPE);
                boolean syncActive = ContentResolver.isSyncActive(
                        account, ScheduleContract.CONTENT_AUTHORITY);
                boolean syncPending = ContentResolver.isSyncPending(
                        account, ScheduleContract.CONTENT_AUTHORITY);
                setRefreshActionButtonState(syncActive || syncPending);
            }
        });
    }
};
...