布局
- LinearLayout 线性布局
布局的层级多(嵌套多)
android:orientation="vertical" | "horizontal" 垂直| 横向
weight 属性:match_parent 的时候值越小,占的空间越大
wrap_content 的时候值越小,占的空间越小
0dp 的时候值越小,占的空间越小(推荐写法) - RelativeLayout 相对布局布局的层级少(嵌套少)
- FrameLayout 帧布局Activity的布局最外层有一个FrameLayout
屏幕适配
名称 | 像素密度范围 |
---|---|
mdpi | 120dpi~160dpi |
hdpi | 160dpi~240dpi |
xhdpi | 240dpi~320dpi |
xxhdpi | 320dpi~480dpi |
xxxhdpi | 480dpi~640dpi |
- 使用wrap_content、match_parent、weight要确保布局的灵活性并适应各种尺寸的屏幕。
- 长度单位使用 dp ,文章使用 sp。
- 控件宽高多采用文件大小,然后使用 padding
Activity
onCreate: Activity正在创建,生命周期的第一个方法。在此方法中做一些初始化工作(setContentView加载界面布局,加载基本数据)
onStart: Activity 正在启动,已经可见,但在后台(没有获得焦点)
onResume: Activity获得焦点出现在前台可以交互
onPause: Activity 正在停止,可做一些数据存储,停止动画...
onStop: Activity 停止,不可见
onDestory: Activity 销毁,进行资源回收
onRestart:Activity 正在重现启动,是当前Activity从不可见到可见状态会触发onActivityResult: 在Activity中得到新打开Activity关闭后返回的数据onSaveInstanceState:Activity被销毁,调用此方法保存当前状态,在onStop之前调用onRestoreInstanceState:Activity 被重启调用,通过Bundle传递保存的数据,在onStart 之后调用
onNewIntent
onTouchEvent 触摸屏幕时调用,可以获取手势的位置
onKeyUp 键盘事件,点击来手机按键onWindowAttributesChangedonWindowFocusChangedonBackPressed 返回键点击onCreateOptionsMenu 加载菜单布局
onOptionsItemSelected 响应菜单选项
Service
Service运行于主线程,和Thread没有任何关系,耗时操作需要再开线程
startService
bindService
IntentService
它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。创建了一个工作队列,来逐个发送intent给onHandleIntent()。不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。默认实现的onBind()返回null默认实现的onStartCommand()的目的是将intent插入到工作队列中
Broadcast
静态和动态两种注册方法:
静态注册, 在AndroidManifest.xml中加上
ListView 优化
listview现在最常用也拥有很好的性能的优化方式是在Adapter中使用静态的ViewHolder
在Adapter的代码中,在getView方法里首先判断convertView是否为空,若为空则加载相应布局,若不为空则
直接使用该布局,这能够很有效的使用Android为listview提供的缓存机制:只加载一屏的布局,之后滑动出来的item使用的是之前已经加载的布局的缓存;
多 item 使用 viewtype
事件分发
多进程
- AsyncTask
继承时为AsyncTask类指定三个泛型参数,
Params
在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
Progress
后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
Result
当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
// 在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,如显示一个进度条对话框
onPreExecute
// 子线程中运行,任务完成会return执行结果
doInBackground
// 进行UI操作
onProgressUpdate
// 任务执行完会retrun结果,就好执行此方法,返回结果做为参数传到此方法中
onPostExecute
- Handler
Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行
描述:Looper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息,而消息的创建者就是一个或多个Handler
Message:消息体,用于装载需要发送的对象。
handler:它直接继承自Object。作用是:在子线程中发送Message或者Runnable对象到MessageQueue中;在UI线程中接收、处理从MessageQueue分发出来的Message或者Runnable对象。发送消息一般使用Handler的sendMessage()方法,而发出去的消息经过处理后最终会传递到Handler的handlerMessage()方法中。
MessageQueue:用于存放Message或Runnable对象的消息队列。它由对应的Looper对象创建,并由Looper对象管理。每个线程中都只会有一个MessageQueue对象。
Looper:是每个线程中的MessageQueue的管家,循环不断地管理MessageQueue接收和分发Message或Runnable的工作。调用Looper的loop()方法后,就会进入到一个无限循环中然后每当发现MessageQueue中存在一条消息,就会将它取出,并调用Handler的handlerMessage()方法。每个线程中也只会有一个Looper对象。
使用ThreadLocal来实现Looper的存储(多线程内存共享时,使用ThreadLocal存储的变量在各线程中不一致)
网络加载
图片加载
view 绘制流程
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树的绘图流程在ViewRoot.java
类的performTraversals()
自定义控件
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
3、重写onMesure
4、重写onDraw