×

深圳网站建设—APP开发—网站制作—小程序开发_博纳网络公司

0755 -
82538016
82560826
网站制作资讯

安卓APP项目开发怎样解决定期执行任务的功能设计?

文章编辑:网站建设 文章来源:APP开发 浏览量:

  安卓APP项目开发怎样解决定期执行任务的功能设计?深圳APP开发公司提醒许多APP都需要定期执行某项或某几项任务,如在联网状态下每隔一段时间上传日志数据给服务器,或在手机处于Idle状态时定期清理存储空间等。
  以往实现这样的功能时,往往需要启动一个定时器不断地轮询执行任务的条件是否满足,如果满足还需启动定时器定期执行任务,这种机制的实现方式比较麻烦。在Android5.0(API21)及以上版本系统中,Google提供了一个叫JobScheduler的功能组件来处理这种场景。
开发APP公司关于JobScheduler介绍 
 在JobScheduler功能类中,有一个JobService类,它是使用JobScheduler回调的入口点。JobService类中包含以下几个方法。
1.onStartJob方法
  booleanonStartJob(JobParametersparams)在JobService的子类中,必须重写这个方法。params:传递此任务的相关信息。返回值为true,此service必须在一个单独的子线程中处理工作;返回值为false,此任务没有工作要做。
2.jobFinished方法voidjobFinished(JobParametersparams,booleanneedsReschedule)这个方法是在任务完成之后被调用。params:这个参数是从onStartJob方法传递过来的。needsReschedule:如为true,此任务只会被执行一次;
false则会被反复执行。
3.onStopJob方法
  booleanonStopJob(JobParametersparams)当系统确定必须停止运行任务时,会调用此方法。如果在设定的时间,任务运行的条件不再满足时此方法就会被调用。如要求设备要连接WIFI,但在执行任务的时候,用户把WIFI关掉了;或者任务需要在Idle状态下执行,但手机进入了非Idle状态。params:表示传递此任务的相关信息。返回值为true时,告诉JobManager根据创建Job时的设置是否重新安排此任务执行;返回值为false时,退出Job。不管返回值是什么,Job都必须停止执行。示例代码如下:
private JobScheduler mJobScheduler; //声明 Job 的 任务 Id 数值 public static final int MY_ BACKGROUND_ JOB = 0; //初始化 JobScheduler 对象 public void initVariables() { ...     mJobScheduler = (JobScheduler) getSystemService( Context. JOB_ SCHEDULER_ SERVICE ); … } //设置 执行 此 任务 需 满足 的 条件、 间隔 时间 和 关机 重 启 后 是否 继续 执行 public static void scheduleJob( Context context) {     JobScheduler js =            ( JobScheduler) context. getSystemService( Context. JOB_ SCHEDULER_ SERVICE);     JobInfo job = new JobInfo. Builder(             MY_ BACKGROUND_ JOB,            // 在 JobSchedulerService 类 中 执行任务             new ComponentName( context, JobSchedulerService. class))
 // 设置 在 联网 状态 下 执行 此 任务 .setRequiredNetworkType( JobInfo. NETWORK_ TYPE_ ANY) //设置 在 设备 处于 Idle 状态 时 执行 此 任务            . setRequiresDeviceIdle( true)            // 设置 在 设备 处于 充电 状态 时 执行 此 任务            . setRequiresCharging( true)            // 设置 任务 的 执行 间隔 时间 为 10 秒            . setPeriodic( 10* 1000)            // 设置 设备 关机 重 启 后, 还是 继续 按 上述 要求 执行 此 任务            . setPersisted( true)            . build();     js. schedule( job); }
Google的官方文档中描述是只有满足执行任务的条件后,任务才会被执行。实际验证,即使条件不满足,任务也会被执行,也就是如下代码和上述代码的实际执行结果一样。
public static void scheduleJob( Context context) {     JobScheduler js =            ( JobScheduler) context. getSystemService( Context. JOB_ SCHEDULER_ SERVICE);     JobInfo job = new JobInfo. Builder(             MY_ BACKGROUND_ JOB,
  new ComponentName( context, JobSchedulerService. class))            // 设置 任务 的 执行 间隔 时间 为 10 秒            . setPeriodic( 10* 1000)            // 设置 设备 关机 重 启 后, 还是 继续 按 上述 要求 执行 此 任务            . setPersisted( true)            . build();     js. schedule( job); } //取消 Job private void cancelJob(){     mJobScheduler. cancelAll(); } //创建 Service 类 public class JobSchedulerService extends JobService {     public static final int MY_ JOB_ MESSAGE = 0;     private Handler mJobHandler = new Handler( new Handler. Callback() {        @ Override         public boolean handleMessage( Message msg ) {             Toast. makeText( getApplicationContext(), "JobService
"JobService task running", Toast. LENGTH_ LONG). show();             jobFinished( (JobParameters) msg. obj, false);             return true;        }    } );    @ Override     public boolean onStartJob( JobParameters params ) {         mJobHandler. sendMessage( Message. obtain( mJobHandler, MY_ JOB_ MESSAGE, params ) );         return false;    }    @ Override     public boolean onStopJob( JobParameters params ) {         Toast. makeText( getApplicationContext(), "JobService task stop", Toast. LENGTH_ SHORT ).show();         mJobHandler. removeMessages( MY_ JOB_ MESSAGE);         return false;    } }
在AndroidManifest.xml中增加如下声明。
< uses- permission android: name=" android. permission. RECEIVE_ BOOT_ COMPLETED" /> < service android: name=". service. JobSchedulerService" android: permission=" android. permission. BIND_ JOB_ SERVICE" />
在上述代码的scheduleJob方法中,设置了执行任务的条件,Google的官方文档中描述只有满足执行任务的条件后,任务才会被执行。实际验证,即使条件不满足,任务也会被执行,也就是scheduleJob方法的代码改成如下所示,运行行结果和上述代码一样。
public static void scheduleJob( Context context) { JobScheduler js =( JobScheduler) context. getSystemService( Context. JOB_ SCHEDULER_ SERVICE); JobInfo job = new JobInfo. Builder( MY_ BACKGROUND_ JOB, new ComponentName( context, JobSchedulerService. class))
//设置 任务 的 执行 间隔 时间 为 10 秒 .setPeriodic( 10* 1000) //设置 设备 关机 重 启 后, 还是 继续 按 上述 要求 执行 此 任务 .setPersisted( true) .build(); js. schedule( job); }  好了,APP开发公司本文关于“安卓APP项目开发怎样解决定期执行任务的功能设计?”的APP制作开发知识就分享到这里,谢谢关注,博纳网络编辑整理。
 

当前文章链接:/construction/appkaifa/2908.html
如果您觉得案例还不错请帮忙分享:

[声明]本网转载网络媒体稿件是为了传播更多的信息,此类稿件不代表本网观点,本网不承担此类稿件侵权行为的连带责任。故此,如果您发现本网站的内容侵犯了您的版权,请您的相关内容发至此邮箱【qin@198bona.com 】,我们在确认后,会立即删除,保证您的版权。