Android 使用AlarmManager与服务器同步数据

Android 使用AlarmManager与服务器同步数据,android,android-intent,alarmmanager,android-syncadapter,Android,Android Intent,Alarmmanager,Android Syncadapter,首先,我为我的英语道歉 我需要将数据发送到服务器,并不时地(可能是每周)查询该服务器中的数据 所以我将使用AlarmManager来实现这一点。我想知道我是否可以在alarm manager中注册两个独立的挂起意图,一个用于将数据推送到服务器,另一个用于从服务器查询数据。我可以在每次应用程序执行时注册这两个意图吗?或者我是否需要测试我是否已经注册了这些意向 我这样问是因为我担心我会在一周后注册一个警报,然后用户关闭应用程序并重新启动,然后在一周后再次注册警报,最后将永远不会启动 另外,向Alar

首先,我为我的英语道歉

我需要将数据发送到服务器,并不时地(可能是每周)查询该服务器中的数据

所以我将使用AlarmManager来实现这一点。我想知道我是否可以在alarm manager中注册两个独立的挂起意图,一个用于将数据推送到服务器,另一个用于从服务器查询数据。我可以在每次应用程序执行时注册这两个意图吗?或者我是否需要测试我是否已经注册了这些意向

我这样问是因为我担心我会在一周后注册一个警报,然后用户关闭应用程序并重新启动,然后在一周后再次注册警报,最后将永远不会启动

另外,向AlarmManager注册要执行的服务安全吗

哦,这是我正在使用的代码:

long WEEK_IN_MILLIS = AlarmManager.INTERVAL_DAY * 7;

PendingIntent querySyncService = PendingIntent.getService(context, 0, new Intent(context,
    QuerySyncService.class), PendingIntent.FLAG_CANCEL_CURRENT);

PendingIntent pushSyncService = PendingIntent.getService(context, 1, new Intent(context,
    PushSyncService.class), PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

alarmManager.setInexactRepeating(AlarmManager.RTC, WEEK_IN_MILLIS, WEEK_IN_MILLIS, querySyncService);

alarmManager.setInexactRepeating(AlarmManager.RTC, WEEK_IN_MILLIS, WEEK_IN_MILLIS, pushSyncService);
我想把这段代码放在某个方法中,然后在每次应用程序启动时调用该方法


我还看到我可能应该使用的解决方案是SyncAdapter,但是SyncAdapter看起来很脏,有很多代码什么都不做,例如,你需要一个存根验证器,然后是一个存根验证器服务和一个存根内容提供程序,再加上一个存根内容提供程序服务,然后是大量的同步适配器代码,然后是另一组只运行同步适配器的代码。这对我来说太脏了,因为我不需要内容提供商,也不需要一个验证器。

你可以用
AlarmManager
注册两个不同的意图。只需确保在调用
pendingent.getService
时使用不同的ID即可。。。(顺便说一句,我建议您不要使用0作为id。在Java中,0s很容易获得)。使用动作或附加中的参数来区分它们

没有理由使用
广播接收器
:您可以直接在
服务
中激发意图。如果您担心安全问题,请不要导出该服务。
pendingent
是从应用程序内部启动的,因此无需使
服务在外部可见

最后,尽管您对SyncAdapter的开销的看法是正确的,但这确实是一种很好的方法,可以准确地完成您要做的事情。有一个很好的描述如何写一个在(我是作者之一)。一旦你通过锅炉板,它实际上几乎是优雅的

这里有一个最小同步适配器的示例