如何在后台调用服务,当应用程序关闭时,那个时间继续工作服务并调用api?

时间:2017-04-15 14:15:50

标签: android service

  • 我每10分钟在后台服务中进行一次api调用,这个应用程序与应用程序关闭时的工作方式相同,怎么可能?

2 个答案:

答案 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