答案 0 :(得分:0)
你的问题并不完全清楚。我假设以下是您的问题并将尝试回答 -
“如何运行在后台运行的服务,并在关闭应用程序以连接到远程服务器时连续运行?”
实现此目标的最佳方法是使用JobScheduler API。 JobScheduler通过批量排队请求帮助您有效地执行网络操作,从而节省电池寿命。这有助于您提供更好的用户体验。
要使用JobScheduler API,您必须创建JobService。 JobService扩展Service,即使应用程序处于后台,也可以让系统运行您的作业。您将需要实施以下方法:
onStartJob()
onStopJob()
对于网络请求等复杂任务,在onStartJob()中返回true,让系统知道后台网络线程仍在运行,并保持唤醒锁定,直到网络线程完成为止。 JobService像其他任何服务一样在主线程上运行,您必须在AsyncTask之类的单独线程中处理网络操作。
当运行作业的作业条件不匹配时,将调用onStopJob()。返回true表示系统在满足作业条件时自动运行/重新安排作业。下面是一个示例代码,可帮助您更好地了解正在发生的事情 -
public class GetImageService extends JobService {
private GetImageTask getImageTask;
@Override
public boolean onStartJob(final JobParameters params) {
getImageTask = new GetImageTask() {
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
jobFinished(params, true);
}
};
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
if (getImageTask != null) {
getImageTask.cancel(true);
}
return false;
}
private class GetImageTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
// todo: connect to remote servers and make a network call here
return null;
}
}
}
由于JobService是服务,您必须在应用程序清单文件中声明它。添加BIND_JOB_SERVICE权限并将exports设置为true以让系统访问您的JobService。
<service
android:name=".activity.GetImageService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"/>
JobScheduler使用JobInfo对象设置的条件显示了它的实际功能。 JobScheduler基于时间和各种条件工作。这使您不必编写AlarmManager或服务,并通过不进行不必要的网络呼叫来节省手机电池。您可以设置网络所需的条件,这意味着您的JobService仅在网络连接时运行。将条件设置为持久将确保您的工作即使在手机重新启动后也能运行。
JobScheduler jobScheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(new JobInfo.Builder(1000,
new ComponentName(this, GetImageService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.build());
调用schedule()方法可确保系统安排您的作业。即使在后台遇到所有条件而用户甚至不打开应用程序时,这也可以使您的工作继续运行。例如,您可以使用它来使用服务器中的最新数据更新表,甚至在用户请求之前。这可以帮助您在用户打开应用程序时立即提供数据,而不是让他等待数据,从而提供非常好的用户体验。
今年发布Android O时,您还应该考虑阅读background limits。借助Android O Google,开发人员更喜欢使用JobScheduler。
有关详细信息,请参阅Google的此博客文章 - https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129
Google的开发人员在GitHub上的示例应用程序 - https://github.com/romannurik/muzei/tree/master/main/src/main/java/com/google/android/apps/muzei/sync
答案 1 :(得分:-1)
使用警报管理器api,请参阅下面的调度重复警报https://developer.android.com/training/scheduling/alarms.html。