一个单独的知识点,肯定是没多大用,但是以这个点为圆心,深入其原理,并且扩展到其他知识点以及各自的用法区别含义,长此以往,不断的整理出自己的知识体系,雪球越滚越大,将会非常有用。
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等组件
注意事项
或许可以用软引用,但是可能会造成空指针的问题。对强引用弱引用的理解还是不太深刻,只是停留在表面。如果这样的单例会造成内存泄漏的话,那么常规单例写法为什么不会造成泄露问题?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 | E/WindowManager: android.view.WindowLeaked: Activity |
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