此刻我很困惑。在Android应用程序中进行日常网络操作的“正确”/“最佳”方式是什么? 伪代码:
If newDay
HTTP Request to server
If responseOfRequest equals something
Do something
If HTTP Request is unsuccessfull (no internet, server down, ...)
Try again in 1 hour
我怎样才能实现这一目标?我考虑过JobService
,但我的minSDK低于Android 5.
干杯, DDerTyp
答案 0 :(得分:1)
您需要的是服务以在后台运行逻辑和警报。
首先是一点理论:
https://developer.android.com/training/scheduling/alarms.html#tradeoffs
重复警报是一种灵活性有限的相对简单的机制。它可能不是您的应用程序的最佳选择,特别是如果您需要触发网络操作。设计不良的警报可能会导致电池耗尽并对服务器造成很大负担。 如果您拥有托管应用程序数据的服务器,则将Google Cloud Messaging(GCM)与同步适配器结合使用是比AlarmManager更好的解决方案。
https://developer.android.com/training/sync-adapters/running-sync-adapter.html
默认情况下,设备关闭时会取消所有警报。
您需要在应用中的某个位置设置闹钟,但需要保存一个标记,因为您不想在每次用户打开应用时设置此闹钟
if (!appSettings.isAlarmSetUp()) {
final AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
final Intent i = new Intent(context, CustomService.class);
final Intent intentNotRepeat = new Intent(context, CustomService.class);
final PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_DAY, pi);
appSettings.setAlarmSetUp(true);
}
这里有关于警报的更多信息: https://developer.android.com/training/scheduling/alarms.html#type
正如您所看到的,此警报唤醒了CustomService,您可以在其中执行所有逻辑
public class CustomService extends IntentService {
public CustomService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
// Request to server
client.requestToServer()
.subscribe(response -> {
// Successful response
doSomething(response);
}
},
error -> {
// Error
createAlarmInOneHour();
});
}
}