Android 作业调度程序与可运行程序:缺点?

Android 作业调度程序与可运行程序:缺点?,android,android-service,Android,Android Service,对于定期的后台任务,我发现经常使用JobScheduler。或者,对于稍微不同的用例,还有JobService和AlarmManager。但是为什么不直接启动一个新的可运行的?在后台任务中使用Runnable有哪些缺点?Runnable空闲时是否会使用更多的资源?Runnable是一个接口,除了提供一个名为run的方法之外,它本身不做任何事情。也许您想知道与JobScheduler、IntentService和AlarmManager相比,如何使用HandlerThread、Thread、Asy

对于定期的后台任务,我发现经常使用
JobScheduler
。或者,对于稍微不同的用例,还有
JobService
AlarmManager
。但是为什么不直接启动一个新的
可运行的
?在后台任务中使用
Runnable
有哪些缺点?
Runnable
空闲时是否会使用更多的资源?

Runnable
是一个接口,除了提供一个名为
run
的方法之外,它本身不做任何事情。也许您想知道与
JobScheduler
IntentService
AlarmManager
相比,如何使用
HandlerThread
Thread
AsyncTask
ExecutorService

这是一份Android线程备忘表:

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

在选择线程机制时,了解Android操作系统如何管理应用程序是很重要的。Android操作系统可以在应用程序中查看应用程序和组件(
活动
服务
广播接收器
内容提供者
)。高级安卓操作系统不知道应用程序内部的线程

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

这在实践中意味着,您可以从
活动中剥离线程,只要进程处于活动状态,线程就可以继续运行,即使
活动可能正在接收这些生命周期回调,Android操作系统也不会暂停或停止线程。然而,当Android决定结束您的进程时,您的所有线程也将死亡。作为一名应用程序开发人员,要让Android知道它不应该终止您的进程,唯一的方法是创建一个
服务
,甚至可能将其设为前台
服务
,以便Android知道您的应用程序中正在发生一些重要的事情,或者使用
WorkManager
,因为Android知道这一点(引擎盖下可能是
服务
…)。当使用
服务
时,您仍然需要剥离某种线程来完成工作,因为
服务
函数在进程的主线程上执行,除非您通过IPC绑定调用接收消息,这些调用在16个绑定线程池上运行,如果
ContentProvider
方法是通过IPC而不是本地重新调用

这里有几个问题可以帮助您决定使用什么:

  • 您是否正在执行一项任务,该任务直接与用户正在屏幕上直观地进行交互的活动有关
考虑
HandlerThread
AsyncTask
,或
ExecutorService

  • 您是在后台播放音乐还是用户希望通过通知控制的其他内容
考虑将
服务
手柄线程
或类似的东西配对

  • 您是否正在执行一项早晚都需要执行的任务,但与屏幕上正在发生的事情没有直接关系
考虑使用
IntentService

  • 如果用户在您的任务即将开始时关闭了设备的电源,您想在设备重新通电时重试吗
考虑
WorkManager

像往常一样,最好直接从客户处获取此类信息