概要
此页面可帮助您选择让应用在后台执行操作的最佳方式,而不会影响应用的性能。
每个Android应用程序都有一个主线程负责处理UI(包括测量和绘图视图),协调用户交互以及接收生命周期事件。如果此线程上发生太多工作,该应用程序会挂起或放慢速度,导致不良用户体验。任何长期运行的计算和操作(例如解码位图,访问磁盘或执行网络请求)都应该在单独的后台线程上完成。一般来说,任何需要超过几毫秒的应该被委派给后台线程。
当考虑做主线程时,考虑三个因素:
-
这项工作是否可以推迟,还是需要在预定时间内完成? 例如,如果您需要从网络获取一些数据以响应用户单击按钮,则必须立即完成该工作。但是,如果您想将日志上传到服务器,那么可以推迟这项工作,而不会影响应用程序的性能或用户期望。
-
一旦工作开始执行,操作系统是否应该尝试保持应用程序的活动? 例如,解码和显示位图只需要在应用程序处于前台并且进程处于活动状态时才会发生。但是,即使应用程序处于后台并且未被主动使用,音乐播放器也需要继续播放音乐。
- 工作是否响应系统触发器开始? 这些触发器可能是网络状态,电池状态,存储级别等等。例如,您可能希望等待与服务器进行通信,直到您退出飞行模式。在这种情况下,如果应用程序进程已死,您可能希望在设备再次联机后重新创建它,以便您可以执行您的工作。
线程池
对于只在应用程序处于前台时才能完成的工作,请使用 ThreadPools。ThreadPools提供一组后台线程来接受和排队提交的工作。如果您需要在此期间监视系统触发器,请使用动态注册的广播接收器 来监视操作系统状态和触发器。
注意:将ThreadPools分组(用于网络,磁盘I / O和计算)。这些类型的工作通常是独立的,不应相互阻碍。
前台服务
对于必须执行完成的工作,如果需要立即执行工作,请使用前台服务。使用前台服务告诉系统,该应用程序正在做一些重要的事情,他们不应该被杀死。用户通过通知托盘中的不允许的通知可以看到前台服务。
WorkManager中
对于必须执行完成且可延期的工作,请使用 WorkManager。WorkManager是一个Android库,当工作的触发器(如适当的网络状态和电池条件)得到满足时,它可以优雅地运行可延迟的后台工作。WorkManager JobScheduler 尽可能使用该框架,以帮助优化电池寿命和批量作业。在Android 6.0(API级别23)以下的设备上,WorkManager尝试使用 Firebase JobDispatcher( 如果它已经是应用程序的附属依赖项); 否则,WorkManager将返回到自定义AlarmManager 实现以优雅地处理您的后台工作。
对后台处理的限制
为了最大限度地利用电池并实现良好的应用程序行为,Android在应用程序(或前台服务通知)对用户不可见时限制后台工作
- Android 6.0(API级别23)引入了打盹模式和应用待机。当屏幕关闭并且设备静止时,打盹模式限制应用程序行为。应用程序待机将未使用的应用程序置于特殊状态,限制其网络访问,作业和同步。
- Android 7.0(API级别24)限制了隐式广播并引入了 Doze-on-the-Go。
- Android 8.0(API级别26)进一步限制了后台行为,例如在后台获取位置并释放缓存的唤醒锁。
WorkManager旨在在这些限制下提供尽可能好的行为。
Lastest Update:2018.05.08
联系我
QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ
公众号推荐: