有什么办法可以在Android Oreo地理围栏触发器中执行异步操作?

时间:2018-08-24 07:01:19

标签: android geolocation location android-8.0-oreo android-geofence

我有一个应用,该应用的服务由地理围栏转换触发。在该服务中,我启动一个LocationClient以获取客户端的最新位置。之后,我将执行异步HTTP操作以与服务器通信。

在奥利奥(Oreo)中,触发地理栅栏时出现“ 不允许后台启动”,因此它不起作用。与广播接收器相同。

据我所知,我唯一的选择是IntentService?但这无法执行任何异步操作,因为该方法退出后立即被杀死。

我的问题:在奥利奥(Oreo)中触发地理围栏时,我是否有任何方式进行异步操作/位置查找?

1 个答案:

答案 0 :(得分:0)

要么使用前景服务(带有正在进行的通知),然后在其中调用后台线程。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(serviceIntent);
} else {
    startService(serviceIntent);
}

请确保您在异步任务完成后在onStartCommand中返回有意义的内容,请使用stopSelf(startId),以防止服务以随机方式重新启动。另外,请确保在完成后立即调用stopForeground(true)取消正在进行的通知。


或使用Firebase Job Dispatcher。您的JobService应该扩展SimpleJobService,因为这已经为您提供了一个异步方法! Simple Job Service

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new 
GooglePlayDriver(getBaseContext()));
myExtrasBundle.putString(SetStatusService.MESSAGE, message);
Job myJob = dispatcher.newJobBuilder()
// the JobService that will be called
.setService(StatusJobService.class)
 // uniquely identifies the job
.setTag(StatusJobService.UNIQUE_ID)
// 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, 15))
// don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.setExtras(myExtrasBundle)
.build();
dispatcher.mustSchedule(myJob);

使方法异步所需的所有信息:

public class JobService extends SimpleJobService {

@Override
public int onRunJob(JobParameters job) {
    if (job != null) {
        Bundle extras = job.getExtras();
        if (extras != null) {
           callServer(extras)
        }
    }
    return RESULT_FAIL_NORETRY;
}}