我正在为互联网讨论板构建一个 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/