Android app开发知识小结
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开发知识小结的更多相关文章
- 关于Android App开发知识体系的一个小总结
前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的知识体系进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 ...
- 一看就懂的Android APP开发入门教程
一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...
- Android APP开发需求文档范本
Android APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...
- Android App开发常用专题开源代码
Android App开发中用到过的专题类开源代码: 项目的需求多了,不知不觉成了Github摘抄员,感谢分享精神,节省了很多弯路和时间.不过想要实现指定效果,还是要看懂作者的思路才好下手改造. 主题 ...
- 关于Android App开发技术分类的一个小总结
前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的技术进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 [ ...
- 写给Android App开发人员看的Android底层知识(1)
这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...
- 写给Android App开发人员看的Android底层知识(2)
(五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...
- 写给Android App开发人员看的Android底层知识(5)
(十)Service Service有两套流程,一套是启动流程,另一套是绑定流程.我们做App开发的同学都应该知道. 1)在新进程启动Service 我们先看Service启动过程,假设要启动的Ser ...
- 写给Android App开发人员看的Android底层知识(6)
(十一)BroadcastReceiver BroadcastReceiver,也就是广播,简称Receiver. 很多App开发人员表示,从来没用过Receiver.其实吧,对于音乐播放类App,用 ...
随机推荐
- 改造过的JS颜色选择器
项目中用到颜色选择功能,在网上找了个颜色选择器,自己改了改代码.做成了一个可动态加载的颜色选择器. 把代码贴上,当是记录. /*Copyright(c)2009,www.supersite.me*/ ...
- C#针对js escape解码
在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...
- 谈谈LoveLive SIF以及即将诞生的LL练习器
由于课程需要和自身需求以及广大的LLer的需求,这个学期我将做一个造福全世界LLer的安卓app,它的名字是——还没想好(喂),总之是个LL SIF的练习器.什么?你问我LL SIF是什么?看来你不是 ...
- cocos的helloworld写法
我觉得吧,做工作是找一份自己喜欢的工作,然后一做很多年,想做安卓就去做,做苹果也去做,现在想转行做游戏,游戏方向有很多,选定前段吧,选定平台COCOS,COOCS有2D和3D,先玩2D吧,写一个hel ...
- 移动端rem实现响应布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 5-Zend Studio配置
0-将文件编码设置成utf-8 Window>Preferences>General>Content Types>Text Default encoding:utf-8 1-Z ...
- NDK开发—基础知识实战Demo
简介 前面写了几篇NDK相关的文章: NDK开发-简介&环境搭建(Eclipse,Android Studio) NDK开发-Android Studio+gradle-experimenta ...
- 夺命雷公狗-----React---23--小案例之react经典案例todos(完成添加任务)
我们这次来处理用户添加的数据,我们还是赵老规矩看看组建大致图... 子组件对父组建进行数据的传递其实是react内部的机智进行处理的了,, 代码如下所示: <!DOCTYPE html> ...
- Java多线程学习(三)
一.线程的异常(续) 在上一篇博文中我们提到了Thread.UncaughtExceptionHandler接口,我们在日常的编写中可以通过实现这一接口来给每一个Thread对象都附着一个异常处理器, ...
- 用ssh整合时,用sessionfactory的getCurrentSession()获取不到session
在用ssh整合时,一开始用的是getCurrentSession(),获取当前线程上的session,但是总是抛异常,不能获取. 后来用sessionfactory的openSession(),但是, ...