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. 改造过的JS颜色选择器

    项目中用到颜色选择功能,在网上找了个颜色选择器,自己改了改代码.做成了一个可动态加载的颜色选择器. 把代码贴上,当是记录. /*Copyright(c)2009,www.supersite.me*/ ...

  2. C#针对js escape解码

    在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...

  3. 谈谈LoveLive SIF以及即将诞生的LL练习器

    由于课程需要和自身需求以及广大的LLer的需求,这个学期我将做一个造福全世界LLer的安卓app,它的名字是——还没想好(喂),总之是个LL SIF的练习器.什么?你问我LL SIF是什么?看来你不是 ...

  4. cocos的helloworld写法

    我觉得吧,做工作是找一份自己喜欢的工作,然后一做很多年,想做安卓就去做,做苹果也去做,现在想转行做游戏,游戏方向有很多,选定前段吧,选定平台COCOS,COOCS有2D和3D,先玩2D吧,写一个hel ...

  5. 移动端rem实现响应布局

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 5-Zend Studio配置

    0-将文件编码设置成utf-8 Window>Preferences>General>Content Types>Text Default encoding:utf-8 1-Z ...

  7. NDK开发—基础知识实战Demo

    简介 前面写了几篇NDK相关的文章: NDK开发-简介&环境搭建(Eclipse,Android Studio) NDK开发-Android Studio+gradle-experimenta ...

  8. 夺命雷公狗-----React---23--小案例之react经典案例todos(完成添加任务)

    我们这次来处理用户添加的数据,我们还是赵老规矩看看组建大致图... 子组件对父组建进行数据的传递其实是react内部的机智进行处理的了,, 代码如下所示: <!DOCTYPE html> ...

  9. Java多线程学习(三)

    一.线程的异常(续) 在上一篇博文中我们提到了Thread.UncaughtExceptionHandler接口,我们在日常的编写中可以通过实现这一接口来给每一个Thread对象都附着一个异常处理器, ...

  10. 用ssh整合时,用sessionfactory的getCurrentSession()获取不到session

    在用ssh整合时,一开始用的是getCurrentSession(),获取当前线程上的session,但是总是抛异常,不能获取. 后来用sessionfactory的openSession(),但是, ...