我有一个应用,该应用的服务由地理围栏转换触发。在该服务中,我启动一个LocationClient以获取客户端的最新位置。之后,我将执行异步HTTP操作以与服务器通信。
在奥利奥(Oreo)中,触发地理栅栏时出现“ 不允许后台启动”,因此它不起作用。与广播接收器相同。
据我所知,我唯一的选择是IntentService?但这无法执行任何异步操作,因为该方法退出后立即被杀死。
我的问题:在奥利奥(Oreo)中触发地理围栏时,我是否有任何方式进行异步操作/位置查找?
答案 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;
}}