使用SyncStatusObserver或其他方式获取同步状态信息?

时间:2011-08-27 11:09:27

标签: sync synchronize android-contentresolver synchronisation

具体来说,我有'Droid HTC难以置信,Android版2.2,基带2.15.00.07.28,内核2.6.32.17-g9a2fe16,Build 3.26.605.1,软件编号3.26.605.1

我已经安装了Eclipse和Android SDK并运行正常。我可以在Eclipse中调试我的Droid上的单步代码,这很好。

我已阅读了大量书籍,并尝试了所有示例,作为实践,并且正在建立在其他面向对象语言(包括C ++,而不是Java)的多年软件开发经验(> 10年)之上,但是我很快就接受了。

我还下载了,我相信,在我的'Droid运行repo / git上运行的源代码版本,我一直在挖掘FRG83G包/ apps / AccountsAndSyncSettings / src / com / android /设置代码。

现在。我想写一个小应用程序,让我知道同步失败时。我试图解决的问题是,在使用GMail联系人界面(例如)进行了大量更改之后,'Droid无法同步它们(可能会删除太多?)。因此,当同步始终失败时,我想显示一个通知栏图标,让我知道此同步失败。如果没有像这样的应用程序,那么它失败的第一个迹象就是我可能在2-3天后发现缺少联系信息。

因此,逻辑似乎表明我的小应用程序需要是SyncStatusObserver,以便在同步操作更改状态时通知,然后在该同步时获取SyncStatusInfo并记录哪个同步失败以及何时失败。根据我的收集,这意味着实现SyncStatusObserver并通过调用ContentResolver.addStatusChangeListener将其连接到广播。我实现了这个,我确实看到了通知消息。

我相信我理解对象模型,因为帐户类型具有零到多个帐户权限,并且每个帐户权限表示正在同步的数据类型(联系人与日历等)。

SyncStatusObserver的单个方法onStatusChanged(final int which)具有'int which'参数,该参数似乎试图指示哪个帐户类型或哪个帐户权限刚刚更改了它的同步状态。我编写并连接了这个,并且正在接收这些方法调用,正如人们所期望的那样,当一种类型的数据同步时。我在应用程序执行时在Eclipse调试器日志记录窗口中观察到了这一点。

我的问题是如何将单个int与哪个参数值关联回帐户类型和/或帐户权限?我想调用SyncInfo getCurrentSync()并记录帐户,权限和startTime。 (为什么要开始时间?我们真的不想要结束时间和结束状态吗?)

在stackoverflow上搜索,我在发布How does one listen for progress from Android SyncAdapter?时发现SyncStatusObserver非常无用,因为它没有使用单个整数参数传递非常有用的信息。哦。行。

我想还有另一种看待这个问题的方法是:在HTC Incredible上,当你在主屏幕上并选择菜单 - >设置 - >账户&同步 - > Google(列出的帐户),用户界面显示上次成功同步GMail帐户的每种帐户类型的时间。获取此信息的代码在哪里,因为这是我所追求的相同信息,并且我希望在每个SyncStatusObserver的onStatusChanged方法调用之后获取此信息。

在发布Syncadapter last update date时,它基本上表明当前Droid代码未公开上次同步日期/时间。

是否有其他方法可以获取每个SyncAdator的上次成功同步日期/时间?我真的想抓住我的痒(可以这么说)。

1 个答案:

答案 0 :(得分:1)

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);
            }
        });
    }
};