android - 后台间隔调用Web服务

标签 android

应用程序需要间隔(例如每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/

相关文章:

带有 backblaze 的 Android 应用程序

android - 第一次以 Debug模式启动应用程序需要花费大量时间

Android 模拟器无法在 Windows 8 测试版中运行

java - 当除法结果包含除法余数时如何增加除法结果?

java - 设置 Arraylist 的 Arraylist 的值

android - 在 2 个 native 模块 (Android NDK) 之间传递数据

android - 如何转到 fragment 中 Webview 中的上一页?

java - 另一个 InstantiationException

java - 长时间运行后,Volley 导致服务崩溃应用程序

android - 在AlertDialog 框设置透明窗口