如何实现Snackbar在多Activity切换时保持屏幕显示
问题解答
原生Snackbar不支持跨Activity持续显示,没有任何hack手段可以绕过这个机制。
根本原因
Snackbar本质是往你传入的父View(当前代码里是原Activity的android.R.id.content根视图)里动态添加的一个子View,生命周期完全和所属Activity的视图树绑定。当你启动新Activity时,原Activity的Window会被新Activity的Window完全覆盖,原Activity进入后台后视图树会暂停渲染,挂载在上面的Snackbar自然会消失,不可能穿透Window层级显示在新页面上。
如果强行把原Snackbar的View实例从原父View移除再添加到新Activity的视图树,会出现状态丢失、动画中断的问题,还会因为持有旧Activity的Context引用引发内存泄漏,不建议尝试。
可落地的替代方案
- 单Activity架构改造(最优方案)
将多Activity跳转的逻辑替换为同Activity下的Fragment切换,Snackbar初始化时绑定Activity层级的根布局,整个页面切换过程中Activity实例不会销毁,Snackbar可以持续在屏幕上展示,完全符合Material Design设计规范,不需要额外权限。 - 全局悬浮窗实现
申请SYSTEM_ALERT_WINDOW权限,通过系统WindowManager添加一个和Snackbar样式完全一致的自定义悬浮View,该View挂载在系统Window层,不依赖任何Activity的视图树,切换Activity时不会消失。缺点是Android 6.0以上版本需要用户手动授权悬浮窗权限,会打断操作流程。 - 新页面接续展示
跳转新Activity时,通过Intent把Snackbar的文案、颜色、时长、图标等参数传递过去,在新Activity页面加载完成后立刻创建一个样式完全相同的Snackbar展示,视觉上可以做到近似无缝接续的效果,适合不想改动现有架构的场景。
内容的提问来源于stack exchange,提问作者mohammed_sajid
相关产品推荐
相关产品推荐

