Pause animators when app is not visible
Because animators are not tied to the lifecycle of any UI elements, it is possible for an app to go into the background and for the animators to continue running. Ideally, the app would track the lifecycle of the activity/etc and pause or disable the animators, but it is common for this to not happen, causing the animators to continue spinning when the app does not need them. The animators are not causing as much work as for a foreground activity (since they do not cause any re-rendering), but they cause work nonetheless by keeping Choreographer awake to continue pulsing frames. The ideal fix would be to introduce new API for animators that tied them to lifecycle concepts (View, Activity, etc). But that kind of fix would only be available for future versions of the platform, and does not address existing app code. A workaround for the current situation is to address the most egregious problems; infinite animators running on backgrounded apps. The fix here is exactly that: when an app's visible surface (either an activity or, for Wallpapers, a WallpaperService) is backgrounded, a request is sent to pause animators for that surface. When that surface comes to the foreground, a request is sent to resume those animators. Since all animators are handled on the same thread for the same process, in AnimationHandler, we should only ever pause animators when *all* surfaces for a process are not visible (and resume them when *any* surface becomes visible). Also, to mitigate any issues with thrashing animator state for apps which become only transiently backgrounded, we delay pausing for some time. Bug: 228598053 Bug: 233391022 Test: new AnimatorLeak CTS test, plus manual testing for activities and wallpapers Change-Id: I8b9f841cc80babb972244c724968a5c085a06b69 Merged-In: I8b9f841cc80babb972244c724968a5c085a06b69
Loading
Please register or sign in to comment