关于联网检测广播中弹窗所引发的思考

一个单独的知识点,肯定是没多大用,但是以这个点为圆心,深入其原理,并且扩展到其他知识点以及各自的用法区别含义,长此以往,不断的整理出自己的知识体系,雪球越滚越大,将会非常有用。

BroadCastReceiver中弹出dialog,这种现象所涉及到的知识点

涉及到的知识点

涉及到的知识点

本文大体上分为11个部分
分别如下
加上xml图。最好是有uml分析的流程图。

1.广播的工作流程

2.intentFilter匹配规则和intent涉及到的设计模式

3.联网状态监测的广播中弹出 dialog的报错注意事项

Android规定大多数的弹窗都要附加在activity之上。如果想要在广播中进行弹窗的话,则必须遵循以下三点
a.设置系统级弹窗权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

b.在show()之前,要先设置Dialog的类型为TYPE_SYSTEM_ALERT。
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

c.动态注册广播(在baseactivity中注册)

4.从设计的角度

为什么现在的APP都不这样设计了
例如微信QQ淘宝百度,当用户没有网络时,仅仅只是一个toast,而不显示弹窗提示用户去设置联网。

4.1 从设计的角度来考虑

多半是因为 用户习惯问题,因为一般用户看到没有网时,都会下滑手机屏幕,打开WiFi或者数据,而不是点到设置,再进行弹窗。

4.2 从开发的角度考虑

部分厂商的”设置wifi”界面的路径不一样,就会存在兼容性问题
解决办法:下载顶部activity软件,知道手机的路径后用隐式intent去打开。

如果争执不下的话,可以做数据埋点

5.关于网络的util

优化的部分

6.关于Context以及对应的设计模式

7.DialogFragment的封装以及涉及到的builder模式

8.管理xml文件

9. 序列化

dialog在封装的过程中,会遇到序列化的问题

10 适配

还有涉及到适配的问题。需要自己弄一套适配的sw和获取屏幕各种玩意的utils,去替换项目中的零散代码。

11 防抖动

如果快速点击多次按钮,不可能让他多次去点击,所以这里还涉及到防抖动

这里的防抖动还会涉及到事件分发以及butterkife的原理,即便是不用,但是可以稍微研究一下。

Android为什么不能和Java一样,new一个activity直接用?原因:Android和Java不同,Android是属于组件式的管理,必须要有activity和service等组件

注意事项
关于context内存泄露的问题
或许可以用软引用,但是可能会造成空指针的问题。对强引用弱引用的理解还是不太深刻,只是停留在表面。如果这样的单例会造成内存泄漏的话,那么常规单例写法为什么不会造成泄露问题?Java里面存在内存泄漏吗?

用ApplicationContext即可和生命周期保持一致。但是不知道为什么

在使用context时,有一个标准,只要是和UI有关的,都要用activity作为context。其他的一些操作,Service,Activity,Application等实例都可以,当然,需要注意Context引用的持有,防止内存泄漏。

12.window和activity以及dialog源码分析

13.window涉及到设计模式,装饰者模式

14.dialog和activity之间的关系,以及生命周期

A 如果是AlertDialog弹出时,Activity只会执行oncreate,onStart,onResume,不会执行onPause(),也就是不会对Activity造成影响,因为dialog本身就是属于Activity的一部分。

dialogFragment时的生命周期和上面一样。

B 如果是dialog样式的Activity的话,则会执行onPause()。

C 跳转到另外一个Activity,才会执行onstop

又涉及到fragment以及dialog的样式。
为什么new fragment要通过static的方式来new,而不是直接new,分别有什么好处?
还需要根据这个思考来画一个流程图。知识点的分散式扩展。

15.dialog还涉及到build模式。只是会用,但是不能灵活使用。

3.懒加载的问题
4.关于各种utils封装的问题
5.关于各种三方库的原理问题
6.接口回调和eventbus的问题。

16 dialog和popuwindow的区别,如何抉择?以及最新的dialogfragment

dialog最大的缺点在于,当屏幕旋转时,Activity重新走一遍生命周期方法,而dialog还持有Activity,就会报错。虽然这个报错不太会影响项目运行

1
2
3
4
E/WindowManager: android.view.WindowLeaked: Activity 
MainActivity has leaked window
com.android.internal.policy.impl.PhoneWindow$
DecorView that was originally added here

popuwindow没有背景色,而且会阻塞Activity的进程
当popuwindow设置外部不可点击时,还会有事件分发的问题要处理。

AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。

又到底好在哪里?
最大的好处在于,dialogfragment是一个fragment,和Activity保持同一套生命周期,比较好控制。

1
那么既然都已经到了Fragment,那么干脆就把Activity和Fragment生命周期给整理一下吧

17 重新去理解Activity和Fragment生命周期

18 四种布局填充器的区别,以及对应的设计模式

枚举的基本使用

关于状态栏白色底部 黑色文字

自带的画线,不需要专门去创建view来画线

superTextView
各种样式包括style 可以学习一下
https://keeganlee.me/post/android/20150909

igding wechat
2018 依计行事 持续精进
坚持原创技术分享,您的支持将鼓励我继续创作!