我想在设备清醒时每隔2分钟上传当前用户的位置,或者在没有设备时每隔5分钟上传一次。
将后台数据(即使应用程序未运行)上传到Web服务器的最佳方法是什么?是IntentService
AlarmManager
还是AsyncTask
,CountdownTimer
更好?
我已经知道如何获取用户的位置,并通过AsyncTask
和IntentService
进行一些练习。任何帮助,将不胜感激!谢谢!
答案 0 :(得分:0)
由于您希望在特定时间段内执行任务,我建议您使用Firebase Job Scheduler和IntentService。
使用Firebase Job Dispatcher有很多优点。
- 你可以给它一些限制,例如“只在电池上执行任务或在充电和使用wifi时执行任务”
- 内置效率
醇>
您可以阅读有关Firebase Job Dispatcher here
的更多信息答案 1 :(得分:0)
它比AlarmManager,Jobschedular和GCMNetworkManager有一些优势。 有关详细信息,请阅读此blog。
<强>用法:强>
将以下内容添加到build.gradle的依赖项部分:
implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
创建一个新的MyJobService类。
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters job) {
// Do some work here
return false; // Answers the question: "Is there still work going on?"
}
@Override
public boolean onStopJob(JobParameters job) {
return false; // Answers the question: "Should this job be retried?"
}
}
将其添加到清单
<service
android:exported="false"
android:name=".MyJobService">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
安排工作
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job myJob = dispatcher.newJobBuilder()
// the JobService that will be called
.setService(MyJobService.class)
// uniquely identifies the job
.setTag("my-unique-tag")
// one-off job
.setRecurring(false)
// don't persist past a device reboot
.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
// start between 0 and 60 seconds from now
.setTrigger(Trigger.executionWindow(0, 60))
// don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
// constraints that need to be satisfied for the job to run
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK,
// only run when the device is charging
Constraint.DEVICE_CHARGING
)
.build();
dispatcher.mustSchedule(myJob);
答案 2 :(得分:0)
有两种更好的方法可以帮助您:
<强> 1。应用程序清醒时
您可以将处理程序用于计时器目的和句柄调用 用于位置更新的IntentService。
IntentService
将会有效 不同的Thread
并将在完成工作后完成。 Handler Example
<强> 2。当应用未运行时
您必须使用
AlarmManager
并从警报接收器中使用 调用IntentService进行位置更新。 AlarmManager Example
希望它会对你有所帮助。