gpt4 book ai didi

android - 后台间隔调用web服务

转载 作者:搜寻专家 更新时间:2023-11-01 07:59:37 25 4
gpt4 key购买 nike

应用程序需要每隔一段时间(例如每 30 分钟)或在后台手动从服务器同步数据。结果保存到本地数据库。同步完成后,我想提醒 Activity/fragment ......并强制更新列表(如果需要)。有很多 Activity ,所以我想将它移到 Activity 之外并使其更加一致。

现在我创建了 AsyncTask,它从服务器获取结果并保存到数据库。

我应该使用什么? BroadcastReciever、服务、AlarmManager?


更新

根据答案,我在应用程序中启动警报

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);

创建一个 BroadcastReceiver,它会在闹钟响起时收到通知。请注意,我使用的是 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 和 Fragments。您可以使用 LocalBroadcastManager 进行广播。看看this链接了解更多详情。

关于android - 后台间隔调用web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com