Job Scheduler vs Runnable:下行?

Joh*_* M. 3 android android-service

对于定期后台任务,我看到JobScheduler经常使用.另外,还有就是也JobServiceAlarmManager对轻微(?)不同的使用情况.但为什么不开始新的Runnable?使用Runnable后台任务的缺点是什么?Runnable闲置时是否会使用更多资源?

sat*_*ine 13

Runnable是一个接口,除了提供一个名为的方法之外,它本身不执行任何操作run.也许你想知道如何HandlerThread,Thread,AsyncTask,ExecutorService使用VS JobScheduler,IntentServiceAlarmManager

这是一个Android线程备忘单:

  • Runnable:一个接口,它本身不做任何事情,但在与许多其他线程相关的类进行交互时使用
  • Thread:从进程的主线程运行代码的最基本的方法.
  • AsyncTask:基于Android的中心方式从主线程运行代码,有一个专用于所有AsyncTask实例的线程,因此在您的进程中一次只能运行一个
  • HandlerThread:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式
  • ExecutorService:强大的线程池,允许您利用多个CPU核心
  • Service (Android):一个没有用户界面但其方法仍然在主线程上运行的android组件
  • IntentService:你可以扩展的一个android服务子类,它包含一个后台线程,在该线程上可以完成没有相关Activity的工作
  • AlarmManager:Android系统提供的一种机制,用于在特定时间启动Android组件,但在重启时会忘记所有内容
  • JobScheduler:Android系统提供的Lollipop及以上机制,根据要完成的工作的描述启动Android服务,并且可以选择在重新启动时保留配置(现在更喜欢WorkManager)
  • WorkManager:Android架构组件(由Google提供,在许多Android版本上运行的库),其工作方式与JobScheduler类似,但还允许协调多个作业

Android OS如何管理进程和线程:

在选择线程机制时,了解Android OS如何管理应用程序非常重要.而Android OS看到应用程序中的应用程序和组件(Activity,Service,BroadcastRecieverContentProvider).高级Android操作系统不知道应用程序内部的线程.

与台式计算机上的应用程序不同,Android OS中安装的应用程序进程具有更加模糊的生命周期.例如,如果你启动计算器app,Android会为它创建一个linux进程.如果你离开计算器,它通常不会立即杀死计算器进程.如果您开始使用许多其他应用程序并且长时间不返回计算器,它最终可能会决定回收计算器进程使用的内存并结束该进程.即使进程存在,用户也可能让手机进入休眠状态,CPU将停止执行所有进程中的所有线程,直到CPU再次唤醒为止.唤醒锁可以防止CPU睡眠.诸如WorkManager可以为您处理唤醒锁的机制.

这在实践中意味着你可以从Activity他们拥有自己生命的线程中剥离线程,只要进程处于活动状态,线程就不会被Android操作系统暂停或停止,即使Activity可能正在接收这些生命周期回调.但是,当Android决定结束您的进程时,所有线程也会死亡.作为应用程序开发人员通知Android它不应该杀死你的进程的唯一方法是创建一个Service甚至可能使它成为前景,Service以便Android知道你的应用程序中正在发生的重要事情,或者WorkManager因为Android知道(在引擎盖下它可能是Service...).当Service你使用a时,你仍然需要分离某种线程来完成你的工作,因为Service函数在你的进程的主线程上执行,除非你通过IPC绑定器调用接收消息,那些运行在16个绑定线程的池上,这同样适用ContentProvider方法,如果他们是通过工控机,而不是在本地调用.

以下是一些问题,可帮助您确定使用方法:

  • 您是否正在执行与用户正在屏幕上直观交互的活动直接相关的任务?

考虑HandlerThread,AsyncTaskExecutorService

  • 您是在后台播放音乐还是其他用户希望通过通知控制的内容?

考虑Service与a HandlerThread或类似的东西配对.

  • 您是否正在执行需要迟早发生的任务,但与现在屏幕上发生的事情没有直接关系?

考虑WorkManager,或AlarmManagerIntentService

  • 如果用户在您的任务即将开始时立即关闭其设备,您是否要在重新启动设备时再试一次?

考虑 WorkManager

一如既往,最好直接从源头获取此类信息.例如https://developer.android.com/topic/libraries/architecture/workmanager Google说:

注意:WorkManager适用于需要保证系统即使应用程序退出也会运行它们的任务,例如将应用程序数据上传到服务器.如果应用程序进程消失,它不适用于可以安全终止的进程内后台工作; 对于这种情况,我们建议使用ThreadPools.

有关这方面的更多提示,请阅读https://developer.android.com/上的javadoc和指南