android - 在没有 GCM 的情况下保持离线数据与服务器同步的高效方法是什么?

标签 android offline-caching

我正在为互联网讨论板构建一个 Android 客户端:该应用程序从服务器下载讨论并使用 native Android UI 显示它们。构建基础知识非常容易,例如获取和显示内容,以及将回复发回服务器。

现在我想把它提升到一个新的水平:应用程序应该将所有数据存储在设备本地并定期与服务器同步,获取最近的更改并更新本地数据库。我不希望它按需检查更改;定期更新更好,因为这允许一些不错的功能,例如订阅更新。

不幸的是,该服务器不符合 GCM(而且永远不会),它是一个很好的老式简单 Web 服务器,所以我必须自己实现同步。

我找到了 a comment to another question据说基于计时器的检查不是一个好主意,因为设备必须唤醒并连接到 Internet。捕捉设备何时开始自己的数据同步会好得多,但是有没有一种方法可以在不定期检查的情况下处理这个问题?

我看过很多关于这个问题的讨论;他们中的大多数讨论内容提供者、协议(protocol)、服务,如 GCM/C2DM 等。我没有发现任何有关电源效率的信息。

那么如何正确地进行同步以使我的应用程序不会耗尽电池电量?

最佳答案

如果您使用 GCM 会更好,因为如果可用,服务器可以推送更新,这比轮询更节能,因为网络只会在更新可用时使用,这比及时轮询要好得多,因为它会检查并唤醒手机只是为了检查更新

重要提示:C2DM 已于 2012 年 6 月 26 日正式弃用。这意味着 C2DM 已停止接受新用户和配额请求。不会向 C2DM 添加新功能。但是,使用 C2DM 的应用程序将继续运行。鼓励现有的 C2DM 开发人员迁移到新版本的 C2DM,称为 Google Cloud Messaging for Android (GCM)。有关详细信息,请参阅 C2DM-to-GCM 迁移文档。开发人员必须使用 GCM 进行新开发。

但是由于您无法使用 GCM,您将不得不自己进行轮询,您可以通过使用警报管理器和不精确的重复以高效的方式使用它

我认为这是定期轮询的最佳省电方式

给出示例代码

public class MyScheduleReceiver extends BroadcastReceiver {

    // Restart service every 30 sec
    private static final long REPEAT_TIME = 1000 * 30 ;

    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmManager service = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, MyStartServiceReceiver.class);
        PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar cal = Calendar.getInstance();
        // Start 30 seconds after boot completed
        cal.add(Calendar.SECOND, 30);
        //
        // Fetch every 30 seconds
        // InexactRepeating allows Android to optimize the energy consumption
        service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), REPEAT_TIME, pending);

        // service.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
        // REPEAT_TIME, pending);
    }
}

(有一个 more detailed explanation that includes the necessary manifest items 。)

关于android - 在没有 GCM 的情况下保持离线数据与服务器同步的高效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120629/

相关文章:

javascript - HTML5 缓存 Javascript 文件以供在线和离线使用

Android Studio - DDMS 不更新文件资源管理器的 View

android - 如何将我的操作栏列表导航定位在右侧?

android - Firebase 在线到 Android 离线数据存储

javascript - 离线网站如何保存数据?

html - HTML 5 "offline web application"中有哪些新内容尚未在所有浏览器中可用?

android - 为什么我的 HttpPut 从我的 Android 发送 GET 请求?

Android房间数据库创建没有ID的实体对象

android - 在 Android 应用程序中使用文本转语音 API

html - 删除 HTML5 离线 AppCache