应用基础知识

488 阅读3分钟

应用基础知识

参考:

developer.android.com/guide/compo…

应用组件:

  • 每个Android应用都处于各自的安全沙盒中
  • Android操作系统是一种多用户的linux系统,其中的每一个应用都是一个不同的用户
  • 每一个进程都拥有自己的虚拟机(vm),因此应用代码独立于其他应用而运行。
  • 四大组件,每个组件都是一个入口点,所以Android应用没有单个入口点;1.activity是与用户交互的入口点;2.服务是一个通用的入口点,是一种后台运行的组件(5.0及以上,请使用jobscheduler,优化工作调度来降低功耗,使用doze api实现省电。3.广播接受者因此系统甚至可以向当前未运行的应用发送广播;可以创建状态栏通知,常见作用是作为通向其他组件的通道;4.内容提供者

启动组件

  • 使用intent启动service,请使用显示intent来确保应用的安全性,因为无法确定哪些服务将相应intent,且用户无法看到哪些服务已启动,从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 [bindService()](https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent, android.content.ServiceConnection, int)),系统会抛出异常

JobScheduler调度任务

参考:

github.com/googlearchi…

www.jianshu.com/p/aa957774a…

www.jianshu.com/p/1f2103d3d…

基础知识

简单使用

  • setPersisted:重启后是否还要继续执行,此时需要声明权限RECEIVE_BOOT_COMPLETED,否则会报错“java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission.”而且RECEIVE_BOOT_COMPLETED需要在安装的时候就要声明,如果一开始没声明,而在升级时才声明,那么依然会报权限不足的错误。

  • setPeriodic:设置时间间隔,单位毫秒。该方法不能和setMinimumLatency、setOverrideDeadline这两个同时调用,否则会报错“java.lang.IllegalArgumentException: Can't call setMinimumLatency() on a periodic job”,或者报错“java.lang.IllegalArgumentException: Can't call setOverrideDeadline() on a periodic job”。 系统设置了默认的最小间隔时间是15分钟,我们设置的时间间隔需要大于15分钟才会生效。flexMillis参数是用来设置周期任务执行的活动时间的,这意味着JobScheduler规划的任务不是在精确的时间执行的。并且这个时间也是有最小值的,系统默认5分钟。
  • startService()多次,只会调用一次onCreate方法,会多次调用onStartCommand方法
  • startService只要jobScheduler.schedule(builder.build())也是会调用JobService的onStartJob方法的。
  • JobService运行在主线程上
  • Android准备好执行任务时,服务就会启动,此时会在主线程上收到onStartJob()方法调用。该方法返回false结果表示该任务已经全部做完,此时系统会解绑该JobService,经测试最终不会调用JobService的onDestroy()方法,效果就如同自己调用了jobFinished()方法一样。返回 true 结果则表示任务已经启动成功,但还没有全部做完,此时可以在任务完成后,应用自行调用jobFinished方法。
  • onStopJob当计划的执行条件“不再”满足时被执行的(例如:条件是有网,网络中断会进入onStopJob)。返回 true 表示:“任务应该计划在下次继续。”返回 false 表示:“不管怎样,事情就到此结束吧,不要计划下次了。”
  • jobFinished(),Job的任务执行完毕后,APP端自己调用,用以通知JobScheduler已经完成了任务。注意:该方法执行完后不会回调onStopJob(),经测试也不会回调onDestroy()当wantsReschedule参数设置为true时,表示任务需要另外规划时间进行执行。而这个执行的时间受限与JobInfo的退避规则。
  • JobScheduler调用cancel方法,取消执行任务,会回调onStopJob()。

  • JobScheduler的setBackoffCriteria方法设置退避规则(重试),initialBackoffMillis需大于10000