我正在为Internet讨论板构建一个
Android客户端:该应用程序从服务器下载讨论并使用本机Android UI显示它们.构建基础知识非常容易,例如获取和显示内容,以及将回复发布回服务器.
现在我想把它带到一个新的水平:应用程序应该在设备上本地存储所有数据,并定期与服务器同步,获取最近的更改并更新本地数据库.我不希望它按要求检查变化;定期更新更好,因为这允许一些很好的功能,如订阅更新.
不幸的是,服务器不符合GCM(它永远不会),它是一个很好的旧的简单Web服务器,所以我必须自己实现同步.
我找到了a comment to another question,据说基于计时器的检查是一个坏主意,因为设备必须唤醒并连接到互联网.当设备开始自己的数据同步时,捕获它会好得多,但它有一种方法来处理这个没有perioic检查?
我已经看过很多关于这个问题的讨论;他们中的大多数人讨论了ContentProviders,协议,GCM / C2DM等服务.我对电源效率一无所知.
那么如何正确地进行同步以便我的应用程序不会耗尽电池?
最佳答案 如果您使用GCM会更好,因为服务器可以推送更新(如果可用)比轮询更省电,因为只有在有可用更新的情况下才会使用网络,这比及时轮询更好,因为它会检查并唤醒手机只是为了检查更新
重要提示:截至2012年6月26日,C2DM已正式弃用.这意味着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.)