我创建了一个Android应用程序,它每5分钟发送一次坐标到我的服务器,在6.0版本之后,当手机进入睡眠/打瞌睡模式时,警报(我测试了每种类型的警报)每1到2个小时触发一次,尽管应用程序在白名单中!
我创建了一个firebase通知,只发送启动服务的数据,但结果是相同的,onMessageReceived在关闭屏幕后触发约10分钟,并在手机唤醒时重新启动……我看到越来越多的话题关注这种情况,但没有人提出一个可行的解决方案。
有人知道我可以不停顿地在后台发送坐标的方法吗?
请帮帮我谢谢
发布于 2017-05-25 17:59:58
@Cristian你需要使用JobScheduler来执行上述API21的后台任务这将为你工作请参考下面的链接
下面是一个定期执行JobService操作的示例:
ComponentName serviceComponent = new ComponentName(context, yourJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
builder.setRequiresDeviceIdle(false);
builder.setRequiresCharging(false);
builder.setPeriodic(60000); // <<<<---- 60 seconds interval
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());https://developer.android.com/reference/android/app/job/JobScheduler.html
https://github.com/googlesamples/android-JobScheduler
或
你可以使用firebase jobdispatcher,它还可以保证设备的电池续航时间,并且还可以兼容最多9个API
发布于 2017-05-26 01:53:11
我让MyJobService扩展了JobService
String TAG = "heyTaxiLOG";
@Override
public boolean onStartJob(JobParameters job) {
// Do some work here
Log.d(TAG,"JobService on Start");
//Start Service extends IntentService
startService(new Intent(this, GPSTracker.class));
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?"
}从谷歌获取位置的GPSTracker as IntentService,这没有问题,太长了!
和dispatcher在MainActivity中的OnCreate方法中调用
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("GPS")
// one-off job
.setRecurring(true)
// don't persist past a device reboot
.setLifetime(Lifetime.FOREVER)
// start between 0 and 60 seconds from now
.setTrigger(Trigger.executionWindow(180, 180))
// don't overwrite an existing job with the same tag
.setReplaceCurrent(true)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
// constraints that need to be satisfied for the job to run
.setConstraints(
Constraint.ON_ANY_NETWORK
)
//.setExtras(myExtrasBundle)
.build();
dispatcher.mustSchedule(myJob);Firebase Job Dispatcher曾经运行过吗?也在打瞌睡模式下吗?
https://stackoverflow.com/questions/44175577
复制相似问题