4

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

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

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

我发现对另一个问题的评论说基于计时器的检查是一个坏主意,因为设备必须唤醒并连接到互联网。当设备开始自己的数据同步时捕捉会更好,但是有没有一种方法可以在没有定期检查的情况下处理这个问题?

我看过很多关于这个问题的讨论;他们中的大多数讨论内容提供者、协议、GCM/C2DM 等服务。我对电源效率一无所知。

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

4

3 回答 3

2

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

重要提示:C2DM 已于 2012 年 6 月 26 日正式弃用。这意味着 C2DM 已停止接受新用户和配额请求。不会向 C2DM 添加任何新功能。但是,使用 C2DM 的应用程序将继续工作。鼓励现有 C2DM 开发人员迁移到新版本的 C2DM,称为 Android 版 Google Cloud Messaging (GCM)。有关更多信息,请参阅 C2DM 到 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);
    }
}

(有更详细的解释,包括必要的清单项目。)

于 2012-08-25T09:13:07.650 回答
0

您可以构建一个小型服务器端应用程序,该应用程序将执行定期轮询并利用 GCM 通知 Android 客户端任何更新。

当然,您还会遇到其他问题,例如需要对每个用户进行轮询。

于 2012-08-25T09:53:28.433 回答
0

GCM 是一个好主意,但正如你所说,这对你来说是不可能的。在这种情况下,我建议这样做:

  1. 如果可能,通过 WiFi 更新。这样,您可能会更快地完成数据传输,从而减少设备无线电激活所需的时间。
  2. 捆绑转移。不要传输说 1 个文件,然后稍等片刻再进行另一次传输。相反,一个接一个地转移。这减少了无线电需要激活的时间,从而节省了电池寿命
  3. 充电时更新,多更新。如果设备正在充电,您可以在不耗尽电池的情况下让网络连接保持更长时间。因此,您可以在充电时同步 3 天的数据,而不是 24 小时的数据,并在用户想要 2 天无法正常同步的数据时节省电池电量。

您还可以观看IO 2012 中关于使用网络时的效率的这次会议。

于 2012-08-25T10:08:16.553 回答