Android知识小结

这是一个知识的总结,所以没有详解的讲解。

一.分辨率
Android中dp长度、sp字体使用、px像素、in英寸、pt英寸1/72、mm毫米

了解dp首先要知道density,density是一个抽象的单位,density值表示每英寸有多少个显示点,与分辨率是两个概念
QVGA屏density=120         QVGA(240*320)
HVGA屏density=160         HVGA(320*480)
WVGA屏density=240        WVGA(480*800)
WQVGA屏density=120      WQVGA(240*400)

在说转换系数,转换系数就是两个不同屏幕density的比例。例如:WVGA屏转QVGA屏,就是120/240。有了这个转换系数就能在不同的屏显示不的长度了。

屏幕一般可分为,状态栏,标题栏和控制区域。

当屏幕density=240时,使用hdpi 标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源

当屏幕density=320时,使用xhdpi标签的资源

当屏幕density=480时,使用xxhdpi标签的资源

二.Touch事件机制
    1.ViewGoup 有三个事件 onTouchEvent事件处理 dispatchTouchEvent事件分发 onInterceptTouchEvent事件拦截
    2.view  有两个事件    onTouchEvent事件处理 dispatchTouchEvent事件分发
    3.最顶层的viewGoup把事件分发到最底层的view,最底层的view通过返回值,告诉父类的view是否消耗到这个事件
    4.事实上Touch事件值响应ACTION_DOWN事件(返回true的view才是真正消耗MotionEvent事件,才会响应ACTION_UP和ACTION_MOVE)
    其他的事件分发原理是一样的
    
    当我们理解了这个事件分发的机制就能解决很多问题了。
    
    1.为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?
    滑动菜单的功能是通过给ListView注册了一个touch事件来实现的。如果你在onTouch方法里处理完了滑动逻辑后返回true,那么ListView本身的滚动事件就被屏蔽了,自然也就无法滑动(原理同前面例子中按钮不能点击),因此解决办法就是在onTouch方法里返回false。
    
    2.为什么图片轮播器里的图片使用Button而不用ImageView?
    图片轮播器里使用Button,主要就是因为Button是可点击的,而ImageView是不可点击的。如果想要使用ImageView,可以有两种改法。第一,在ImageView的onTouch方法里返回true,这样可以保证ACTION_DOWN之后的其它action都能得到执行,才能实现图片滚动的效果。第二,在布局文件里面给ImageView增加一个android:clickable="true"的属性,这样ImageView变成可点击的之后,即使在onTouch里返回了false,ACTION_DOWN之后的其它action也是可以得到执行的。

三.view的绘制过程

view的绘制分三步走,onMeasure,onLayout,onDraw  view的绘制首先要计算大小,然后布局坐标,最后就绘制。

1.onMeasure计算大小,有两个参数,分别是widthMeasureSpec,heightMeasureSpec这两个参数。每一个MeasureSpec有一个尺寸(s    ize)和一个模式(mode)构成,所以要对widthMeasureSpec和heightMeasureSpec做拆分。view的大小通过父类和它自己共同控制的

Mode一共有三种
    EXACTLY 父类决定子类的大小
    AT_MOST 父类限定子类的最大尺寸
    UNSPECIFIED 父类不对子类做限制,子类需要多大就多大
    2.onMeasure计算完之后,就开始布局onLayout,onLayout会返回坐标,这样就能在指定的地方绘制了,onLayout在ViewGroup使用。可以控制子view。
    
    3.onDraw就是绘制了,会返回一个画布,想画啥就画啥了。
    
    了解了view的绘制过程,就可以通过重写控件或者自定义控件,实现各种的需求。

四.Handler, Looper的理解

首先理解四个概念

Looper:不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper中的prepare方法,通过这个方法就可以在线程上创建一个Looper,如果多个Looper会抛异常。UI线程默认就有一个Looper。使用Handler的send方法就可以往消息队列放一条msg,Looper.loop()这个方法就是消息循环,有一个while循环不断去消息队列MessageQueue获取msg。通过回调Handler的dispatchMessage,dispatchMessage会给handleCallback或者handleMessage。这样就实现了线程间的通讯。

如果要详细理解,百度一下就有十分多的资料。

五.Android跨进程通讯

1.广播和Content Provider ,此处略。
2.aidl
aidl的使用,一个进程作为服务端,一个程序作为客户端。他们之间的通讯通过Service。服务端提供调用的接口,客户端绑定服务,调用服务端的方法。aidl支持普通的数据类型,其他数据类型要序列化,继承Parcelable。
3.共享UserId
android的安全机制来自于lunix,同时通过userid权限来管理的,例如root,system和普通的权限。后来也出了个SEAndroid。只要你共享了userid,不同应用之间就能通讯了。共享userid必须签名是一致。

Android app开发知识小结的更多相关文章

  1. 关于Android App开发知识体系的一个小总结

     前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的知识体系进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 ...

  2. 一看就懂的Android APP开发入门教程

    一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...

  3. Android APP开发需求文档范本

    Android  APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...

  4. Android App开发常用专题开源代码

    Android App开发中用到过的专题类开源代码: 项目的需求多了,不知不觉成了Github摘抄员,感谢分享精神,节省了很多弯路和时间.不过想要实现指定效果,还是要看懂作者的思路才好下手改造. 主题 ...

  5. 关于Android App开发技术分类的一个小总结

     前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的技术进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 [ ...

  6. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  7. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  8. 写给Android App开发人员看的Android底层知识(5)

    (十)Service Service有两套流程,一套是启动流程,另一套是绑定流程.我们做App开发的同学都应该知道. 1)在新进程启动Service 我们先看Service启动过程,假设要启动的Ser ...

  9. 写给Android App开发人员看的Android底层知识(6)

    (十一)BroadcastReceiver BroadcastReceiver,也就是广播,简称Receiver. 很多App开发人员表示,从来没用过Receiver.其实吧,对于音乐播放类App,用 ...

随机推荐

  1. Linux Crontab 安装使用详细说明

    crontab命 令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供 之后读取和执行.通常,crontab ...

  2. httpclient4 文档翻译

    前言超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了.Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴,同时,也增加了需要 ...

  3. 浅述WinForm多线程编程与Control.Invoke的应用

    VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...

  4. java htmlunit 抓取网页数据

    WebClient webClient=new WebClient(BrowserVersion.CHROME); webClient.setJavaScriptTimeout(5000); webC ...

  5. phpcms v9联动菜单的调用方法及get_linkage函数简单过程

    {get_linkage($r['areaid'],1,' >> ',1)} 复制代码 当然这个 $r 也不是绝对的.要看你的loop 是如何写的. {loop $data $n $r} ...

  6. python:字符串转换成字节的三种方式

    str='zifuchuang' 第一种 b'zifuchuang'第二种bytes('zifuchuang',encoding='utf-8')第三种('zifuchuang').encode('u ...

  7. C#调用RAR压缩与解压

    public void RARsave(string rarPatch, string rarFiles,string  patch,string rarName)        {          ...

  8. fiddler如何修改request header

    在命令行中输入命令:  bpu www.baidu.com   (这种方法只会中断www.baidu.com) 然后刷新网站,在fiddler中点击被打断的网址,点击Inspectors—>Ra ...

  9. Android Paint的属性

    在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下. 方法一: 1 //设置绘制的颜色,a代表透明度,r,g,b代表颜色值. 2 s ...

  10. jmeter agent配置

    Agent端配置 修改配置文件:JMETER_HOME/bin/jmeter.properties 中如下信息即可完成配置执行机远程启动端口(默认为 1099) server_port=1029 se ...