首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在后台调用服务,当应用程序关闭时,该时间继续工作服务和调用api?

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

Stack Overflow用户
提问于 2017-04-15 14:15:50
回答 2查看 4.3K关注 0票数 0
  • 我每10分钟在后台服务中执行一个api调用,这个调用与应用程序关闭时的工作原理相同,怎么可能?
EN

回答 2

Stack Overflow用户

发布于 2017-04-18 07:02:55

你的问题还不完全清楚。我假设以下是你的问题,我会尽力回答-

“如何运行在后台运行的服务,并在关闭应用程序以连接到远程服务器时继续运行?”

实现这一目标的最佳方法是使用JobScheduler API。JobScheduler通过将请求批量排队来帮助您高效地执行网络操作,从而节省了电池寿命。这有助于您提供更好的用户体验。

要使用JobScheduler API,您必须创建一个JobService。JobService扩展了服务,使系统能够运行您的工作,即使应用程序处于后台。您需要实现以下方法:

代码语言:javascript
复制
onStartJob()
onStopJob()

对于复杂的任务,如网络请求,在onStartJob()中返回true,让系统知道后台网络线程仍然在运行,并保持清醒锁,直到网络线程完成。与任何其他服务一样,JobService在主线程上运行,您必须在一个单独的线程(如AsyncTask )中运行网络操作。

当运行作业的作业条件不匹配时,将调用onStopJob()。返回true可以告诉系统在满足作业条件时自动运行/重新安排作业。

下面是一个示例代码,可以帮助您更好地理解正在发生的事情-

代码语言:javascript
复制
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。

代码语言:javascript
复制
<service 
    android:name=".activity.GetImageService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="true"/>

JobScheduler通过使用JobInfo对象设置的条件显示了它的真正威力。JobScheduler基于时间和各种条件工作。这使您不编写AlarmManager或服务,并通过不进行不必要的网络呼叫来节省电话电池。您可以设置网络所需的条件,这意味着您的JobService只在有网络连接时才会运行。将条件设置为持久化将确保即使在电话重新启动后作业也能运行。

代码语言:javascript
复制
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上的一个示例应用程序。

票数 2
EN

Stack Overflow用户

发布于 2017-04-15 14:31:50

使用警报管理器api,请参阅下面的调度重复警报https://developer.android.com/training/scheduling/alarms.html

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43427120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档