189 8069 5689

android开发干货,Android应用开发详解

Carson带你学Android:手把手教你写一个完整的自定义View

自定义View一共分为两大类,具体如下图:

创新互联是一家专业提供武乡企业网站建设,专注与网站制作、网站建设H5响应式网站、小程序制作等业务。10年已为武乡众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。

对于自定义View的类型介绍及使用场景如下图:

在使用自定义View时有很多注意点(坑),希望大家要非常留意:

View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。

主要针对View中含有线程或动画的情况: 当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题 。

当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。

接下来,我将用自定义View中最常用的 继承View 来说明自定义View的具体应用和需要注意的点

在下面的例子中,我将讲解:

下面我将逐个步骤进行说明:

步骤1:创建自定义View类(继承View类)

特别注意:

步骤2:在布局文件中添加自定义View类的组件及显示

至此,一个基本的自定义View已经实现了,运行效果如下图。

接下来继续看自定义View关于属性自定义的问题:

先来看wrap_content match_parent属性的区别

如果不手动设置支持 wrap_content 属性,那么 wrap_content 属性是不会生效(显示效果同 match_parent )

padding 属性:用于设置控件内容相对控件边缘的边距;

如果不手动设置支持padding属性,那么padding属性在自定义View中是不会生效的。

绘制时考虑传入的padding属性值(四个方向)。

除了常见的以android:开头的系统属性(如下所示),很多场景下自定义View还需要系统所没有的属性,即自定义属性。

实现自定义属性的步骤如下:

下面我将对每个步骤进行具体介绍

对于自定义属性类型 格式如下:

至此,一个较为规范的自定义View已经完成了。

Carson_Ho的github: 自定义View的具体应用

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。

Carson带你学Android:你真的了解view.post()吗?

为什么view.post()能保证获取到view的宽高?

View.post()的原理: 以Handler为基础,View.post() 将传入任务添加到 View绘制任务所在的消息队列尾部,从而保证View.post() 任务的执行时机是在View 绘制任务完成之后的。 其中,几个关键点:

所以:

具体源码分析请看: Android:为什么view.post()能保证获取到view的宽高?

为什么onCreate()使用view.post()无法立刻执行任务(如获取宽高),需要在onResume()后才可获取?

在onCreate()时,AttachInfo还没被赋值(为null)(是在view.dispatchAttachedToWindow()才被赋值),所以会走下述源码的过程2;通过上面分析,此过程的作用仅是:保存了通过post()添加的任务,并没执行。

若只是创建一个 View 调用它的post(),那么post的任务会不会被执行?

不会。主要原因是:

每个View中post() 需执行的任务,必须得添加到窗口视图-执行绘制流程 - 任务才会被post到消息队列里去等待执行,即依赖于dispatchAttachedToWindow ();

若View未添加到窗口视图,那么就不会走绘制流程,post() 添加的任务最终不会被post到消息队列里,即得不到执行。(但会保存到HandlerAction数组里)

上述例子,因为它没有被添加到窗口视图,所以不会走绘制流程,所以该任务最终不会被post到消息队列里 执行

此时只需要添加将View添加到窗口,那么post()的任务即可被执行

view.pos()传入的任务被执行的有效期是多久?

在整个 Activity 的生命周期内都可以正常使用 View.post() 任务

任务被执行是构造AttachInfo,所以任务释放即时释放AttachInfo (置为null)。而AttachInfo 的释放操作(置为null)是在 Activity 生命周期 onDestory 方法之后

下面,我们将分析,什么时候调用上述入口,即DecorView.dispatchDetachedFromWindow();

此时需从 将DecorView从WindowManager中移除 开始讲起:移除 Window 窗口任务是通过 ActivityThread.handleDestoryActivity()完成。

View.post() 任务被执行的有效期是在 Activity 生命周期 onDestory()后。本质是追踪AttachInfo的释放过程(置为null)

AttachInfo的释放过程是在 将DecorView从WindowManager中移除时:回调DecorView.dispatchDetachedFromWindow(),其具体行为是:

而上述过程是在ActivityThread.handleDestoryActivity()中回调 Activity.onDestory()之后。

至此,关于view.post()的四大常见疑问 (坑)内容讲解完毕。

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。

Carson带你学Android:全面解析 熟悉而陌生 的Application类使用

即不同的组件(如 Activity、Service )都可获得 Application 对象且都是同一个对象

Application 对象的生命周期是整个程序中最长的,即等于 Android App 的生命周期

那么,该 Application 类有什么作用呢?下面,我将介绍 Application 类的方法使用

典型的应用场景有两个:

特别注意: onTrimMemory() 中的 TRIM_MEMORY_UI_HIDDEN 与 onStop() 的关系

调用时刻:应用程序结束时调用

从 Applicaiton 类的方法可以看出, Applicaiton 类的应用场景有:(已按优先级排序)

即继承 Application 类

在 Manifest.xml 文件中 application 标签里进行配置

Manifest.xml

至此,关于 Applicaiton 类已经讲解完毕。

下面我将继续对 Android 中的知识进行深入讲解 ,感兴趣的同学可以继续关注 Carson_Ho 的

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。


网站栏目:android开发干货,Android应用开发详解
标题路径:http://cdxtjz.cn/article/dscjsso.html

其他资讯