Android基础知识总结(三)

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文件,使用各种尺寸屏幕

Android基础知识总结(三)_第1张图片

布局文件中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()。

Android基础知识总结(三)_第2张图片
事件分发机制原理图

当一个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 )

你可能感兴趣的:(Android基础知识总结(三))