应用程序需要间隔(例如每30分钟)或在后台手动从服务器同步数据。结果保存到本地数据库。同步完成后,我想提醒 Activity/fragment ...并强制更新列表(如果需要)。有很多 Activity ,所以我想将其移到 Activity 之外并使其更加一致。
现在我创建了 AsyncTask,它从服务器获取结果并将结果保存到数据库。
我应该使用什么?广播接收器、服务、警报管理器?
更新
根据答案,我在应用程序中启动警报
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
manager.setInexactRepeating(AlarmManager.RTC, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
已创建接收者
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent syncIntent = new Intent();
syncIntent.setClass(context, DataSyncer.class);
startWakefulService(context, syncIntent);
}
}
已创建IntentService
public class DataSyncer extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
// get data from server
// save to DB
AlarmReceiver.completeWakefulIntent(intent);
}
}
并在AndroidManifest中注册Receiver和Service
<service
android:name="com.cloudit.tsystems.app.DataSyncer"
android:enabled="true">
</service>
<receiver
android:name="com.cloudit.tsystems.app.AlarmReceiver"
android:enabled="true">
</receiver>
在哪里以及如何通知 Activity/Fragment 中的同步已完成?
最佳答案
我将使用 AlarmManager 并注册一个 BroadcastReceiver。一旦接收器被触发,我将启动一个 IntentService 在后台下载数据。
配置您的闹钟:
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
manager.setInexactRepeating(AlarmManager.RTC, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
创建一个广播接收器,当闹钟响起时它将收到通知。请注意,我使用的是 WakefulBroadcastReceiver这样设备在同步时就不会进入休眠状态。
class MyBroadcast extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent syncIntent = new Intent();
syncIntent.setClass(context, DataSyncer.class);
startWakefulService(context, syncIntent);
}
}
接下来,一个 IntentService 将在后台下载数据:
class DataSyncer extends IntentService{
...
@Override
protected void onHandleIntent(Intent intent) {
//sync data
MyBroadcast.completeWakefulIntent(intent);
}
}
更新: 现在您已经同步了数据,有几个选项可以通知 Activity 和 fragment 。您可以使用 LocalBroadcastManager 进行广播。看看this链接了解更多详细信息。
关于android - 后台间隔调用Web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001143/