发布于 2017-04-18 07:02:55
你的问题还不完全清楚。我假设以下是你的问题,我会尽力回答-
“如何运行在后台运行的服务,并在关闭应用程序以连接到远程服务器时继续运行?”
实现这一目标的最佳方法是使用JobScheduler API。JobScheduler通过将请求批量排队来帮助您高效地执行网络操作,从而节省了电池寿命。这有助于您提供更好的用户体验。
要使用JobScheduler API,您必须创建一个JobService。JobService扩展了服务,使系统能够运行您的工作,即使应用程序处于后台。您需要实现以下方法:
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权限并将其设置为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今年的发布,你也应该考虑阅读有关背景限制的内容。对于Android,谷歌更倾向于开发人员广泛使用JobScheduler。
有关更多信息- https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129,请参阅Google的这篇博客文章。
也是Google - https://github.com/romannurik/muzei/tree/master/main/src/main/java/com/google/android/apps/muzei/sync开发者在https://github.com/romannurik/muzei/tree/master/main/src/main/java/com/google/android/apps/muzei/sync上的一个示例应用程序。
发布于 2017-04-15 14:31:50
使用警报管理器api,请参阅下面的调度重复警报https://developer.android.com/training/scheduling/alarms.html。
https://stackoverflow.com/questions/43427120
复制相似问题