21.ANR(Application Not Responding)
扩展文链接:深入理解ANR -
Android应用程序有一段时间响应不够灵敏,系统会向用户显示应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现ANR,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
原因:主线程做耗时操作;主线程被其他线程锁;CPU被其他进程占用,该进程没有分配CPU资源;OnReceiver过多操作,IO操作,如数据库、文件、网络。
22.自定义View
扩展文链接:Android自定义View全解 -
自定义组合控件 多个控件组合成为一个新的控件,方便多处复用
继承系统View控件 继承自TextView等系统控件,在系统控件的基础功能上进行扩展
继承View 不复用系统控件逻辑,继承View进行功能定义
继承系统ViewGroup 继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展
继承ViewViewGroup 不复用系统控件逻辑,继承ViewGroup进行功能定义
View绘制流程基本由measure()、layout()、draw()这个三个函数完成
函数作用相关方法
measure()测量View的宽高measure(),setMeasuredDimension(),onMeasure()
layout()计算当前View以及子View的位置layout(),onLayout(),setFrame()
draw()视图的绘制工作draw(),onDraw()
自定义View的注意事项 参考文章:Android自定义View注意事项 -
①需要在onMeasure方法中处理wrap_content的方法,让View支持wrap_content;
②避免padding和子元素的margin失效,让View支持padding;
③尽量不要在View中使用Handler,View中已提供了post系列方法,可替代Handler作用;
④避免造成内存泄漏,View中如果有线程或者动画,需要及时停止。
23.MVC、MVP、MVVM三种架构设计
扩展文链接:Android高精战争(MVC、MVP、MVVM) - lihaoxiang123的博客 - CSDN博客
MVC全名是Model View Controller,如图,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。
MVP从更早的MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):
View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)
Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试
MVC 与MVP的区别
(最主要区别)View与Model并不直接交互,而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。而Controller是基于行为的,并且可以被多个View共享,Controller可以负责决定显示哪个View
Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。
在MVP中,Activity的代码不臃肿;
在MVP中,Model(IUserModel的实现类)的改动不会影响Activity(View),两者也互不干涉,而在MVC中会;
在MVP中,IUserView这个接口可以实现方便地对Presenter的测试;
在MVP中,UserPresenter可以用于多个视图,但是在MVC中的Activity就不行。
MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。
24.APP 启动流程
点击桌面图标,launcher进程启动主Activity以Binder方式发送给AMS服务,交付给ActivityManagerService处理Intent和flag信息,通过prepareMainLooper()方法loop处理消息
25.插件化
解除代码耦合,插件支持热插拔,静默升级,从根本上解决65k属性和方法的bug,进行自定义classLoader。
插件化和热修复都是动态加载技术,使用场景不同,热修复为解决线上问题或者小功能更新,插件化解决应用上的大问题。
组件化:为了解耦,把复杂系统拆分成多个组件,分离组件边界和责任,便于独立升级和维护。
26.Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。Kotlin已正式成为Android官方支持开发语言。
React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台。RN使用Javascript语言,类似于HTML的JSX,以及CSS来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。 flutter。
27.Framework 工作原理
Android 系统对Linux、kernel、lib库等封装,提供WMS、AMS、binder机制,handler-message机制等方式,供APP使用。Framework 就是提供APP生存环境。
28.Android 屏幕适配
各种dp文件,使用各种尺寸屏幕
布局文件中view设置高宽时不限定大小,尽量使用wrap_content,match_parent;代码中设置高宽前可获取屏幕大小,如果是线性布局可设置view在LinearLayout的weight;单位dp适配屏幕,单位sp适用字体,多图片,多布局。
29.事件分发机制
dispatchTouchEvent() 负责事件分发。当点击事件产生后,事件首先传递给当前Activity,调用Activity的dispatchTouchEvent()方法,返回值为true则表示View或子View消费了此事件,如果返回true,则表示没有消费事件,并调用父View的onTouchEvent方法。
onTouchEvent()用于处理事件,返回值决定当前控件是否消费了这个事件,也就是说在当前控件在调用父View的onTouchEvent方法完Touch事件后,是否还允许Touch事件继续向上(父控件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回true,则向上传递给父控件。
onInterceptTouchEvent() ViewGroup的一个方法,用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()。
当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。上述例子中的消息下发顺序是这样的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。
小结:onInterceptTouchEvent()默认返回false,不做截获。返回true之后,事件流的后端控件就没有机会处理touch事件。view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理,如果onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
30.Android 动画分类:视图,属性,帧,gif。
上一篇:Android基础知识总结(二)
下一篇:Android基础知识总结(四)
每天进步一点点。。。(2019-05-09 )