Android加载弹窗(loading dialog)封装的思考

本文探讨了在Android应用中创建系统全局Dialog的两种常见方法:基于栈顶Activity和基于Service的悬浮窗。同时介绍了在BaseActivity或BaseFragment中封装LoadingDialog的简便方式,以及Google推荐的使用DialogFragment替代普通Dialog的优势。


前言

我们在进行网络请求或者其他一些耗时的操作时,为了良好的用户的体验和系统稳定性,需要弹出dialog来提示用户,并且限制用户的操作行为。有的的loading dialog是纯进度条的方式,有的是自定义的特殊动画效果,有的是进度条+文字,但无论哪种,都需要创建dialog,为了避免重复的模板代码,往往会对dialog进行封装。


1 系统全局dialog

因为某些特殊需求,比如请求失败统一自动关闭loading dialog,很多人的想法都是希望封装一个在系统内全局存在,随处可调用的dialog,常见的流传比较广的封装方式有两种。

1.1 基于栈顶activity系统全局dialog

一般我们创建的dialog都是依附于activity,假设现在管理全局弹窗的工具名为DialogManager,如果要在非activity中弹出dialog,那就必须要把当前处于栈顶的activity (这里称为:TopActivity) 传给DialogManager,直接传递的话,就需要activity持有DialogManager实例,这样就不能实现全局化了,所以我们必须通过间接的方式来传递。常见的做法是通过监听activity的生命周期,来取得当前的TopActivity,比如通过ActivityLifecycleCallbacks进行监听。


1.2 基于Service的悬浮窗

这种方式也是网上流传比较广的一种方式,利用WindowManager.LayoutParams.TYPE_SYSTEM_ALERTWindowManager.LayoutParams.TYPE_TOASTWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
等属性来将dialog变为悬浮窗,这种方式的坑也很多,比如权限限制,版本适配,第三方厂商ROM适配等,网上可以找到很多相关资料, 这里不作详细叙述。


2 非全局的dialog

基本上我们的网络请求都是在Activity或者Fragment中发起的,退求其次,我们可以在BaseActivity/BaseFragment中封装一个loading dialog,这样就能很方便的调用了。而且Google官方在很早之前就推荐使用DialogFragment来替代普通的dialog,而Fragment是必须依附Activity的,在BaseActivity/BaseFragment中封装也更方便。(PS:DialogFragment的优势在网上已经有很多文章讲解,这里不作详细叙述。)


记录,分享,交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值