在后台服务中上传数据

时间:2018-02-19 06:04:03

标签: java android android-service background-process

我想在设备清醒时每隔2分钟上传当前用户的位置,或者在没有设备时每隔5分钟上传一次。

将后台数据(即使应用程序未运行)上传到Web服务器的最佳方法是什么?是IntentService AlarmManager还是AsyncTaskCountdownTimer更好?

我已经知道如何获取用户的位置,并通过AsyncTaskIntentService进行一些练习。任何帮助,将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:0)

由于您希望在特定时间段内执行任务,我建议您使用Firebase Job Scheduler和IntentService。

使用Firebase Job Dispatcher有很多优点。

  
      
  1. 你可以给它一些限制,例如“只在电池上执行任务或在充电和使用wifi时执行任务”
  2.   
  3. 内置效率
  4.   

您可以阅读有关Firebase Job Dispatcher here

的更多信息

答案 1 :(得分:0)

我建议Firebase JobDispatcher.

它比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

希望它会对你有所帮助。