年前知识复习:Android  
一、第一天 :初识Android  基于Linux移动端的操作系统
Android系统结构:
1.第一层 Application   应用层
2.第二层 Application FrameWork 应用程序框架层
3.第三层 Library 核心库 (DVM虚拟机)
4.第四层 Linux Core  Linux内核  
ADB命令: Android Debug Bridge  
1.adb start-server  启动ADB命令服务
2.adb kill-server 杀死ADB命令
3.install (-r)apk路径  安装一个apk到手机
4.unInstall apk包名 卸载一个 apk
5.adb shell   进入目标设备的Linux命令环境
6.adb devides 查看所有的链接设备列表
创建项目 - 对项目结构的理解
二、第二天:五大常用布局:
RaletiveLayout 相对布局:
1.属性。 相对于 父布局的 相对于兄弟空间的 
2.所有的View通用的属性
LinearLayout 线性布局
1.属性。layout_weight 权重  : 分配剩余空间
2.属性。android:orientation: vertical/horizontal  表示线性布局的方向
FrameLayout  帧布局:
1.像图片一样一帧一帧的叠加的 视图   
2.使用 gravity来控制子控件的位置
TableLayout 表格布局:
1.TabRow  表示一行
AbsoluteLayout  绝对布局:
1.layout_x: 表示视图左上角所在位置的x轴坐标
2.layout_y:表示视图左上角所在位置的y轴坐标
三、第三天:视图: 
TextView :  文本视图
1.text: 显示文本
2.textSize:
3.textColor:
4.singleLine:单行展示
5.maxLines :最大行数
。。。
EditeText: 文本输入框   父类是 TextView
1.用户输入文本
2.hint : 提示显示的文本
3.inputType : 修改输入展示内容的样式 类型  。   password  密文展示  phone 等
。。
Button:  按钮   父类 TextView
1.onClick 属性  
2.五种点击事件注册方法
1)内部类
2)外部类
3)匿名内部类
4)本类实现接口
5)onClick属性
。。。
ImageView 展示图片的视图
1.src : 用于展示图片的资源
2.scaleTpye  :图片在视图中展示的类型  
3.background 用于展示图片背景
。。。
ImageButton 能够展示图片的按钮:父类是 Imageview
四、第四天 单选框和复选框
RadioButton: 单选框
1.必须配合RadioGroup才能有互斥的效果
2.属性 isChecked  表示是否被选中
3.监听器 setOnCheckedChangedListener
RadioGroup: 父类是LinearLayout
1.配合RadioButton 有 互斥效果
CheckBox :  复选框 
1.属性 isChecked  表示是否被选中
2.监听器 setOnCheckedChangedListener
五、第五天  Activity  
Activity定义:
1.Android四大组件之一 service、ContentProvider 、BroadCastReceiver
2.应用程序每个页面的载体 承载着 视图与用户进行交互的关系
3.四大组件在使用的时候必须在清单文件中进行注册
Activity生命周期
1.onCreate  创建
2.onStart  启动
3.onResume 执行  可视可交互
-- Activity处于 运行状态
4.onPause 暂停
5.onStop 停止
6.onDestroy   销毁
7.onRestart 重启
Activity启动模式:  在清单文件中注册的时候添加 launchMode属性
1.standard:  默认的启动模式,每次启动都会创建一个新的实例放在任务栈中
2.singleTop:单顶,每次启动创建实例放在栈顶,如果栈顶已有该任务则不创建
3.singleTask:只要任务栈中存在,则不创建
4.singleInstance:创建一个新的任务栈单独存放该实例
六、第六天  Intent跳转传值
Intent定义:  链接四大组件的枢纽,拥有启动和传递数据的作用
传值:
1.静态变量(不推荐使用)
2.全局变量
3.Intent
4.Intent回传值
七、第七天 Json
Json: 轻量级与服务器进行交互的数据格式
原生解析:
1.JSONObject  、JSONArray
2.Gson: google 提供的一个Json解析的工具类
添加依赖   compile 'com.google.code.gson:gson:2.8.2'
1)解析对象
Gson gson =  new Gson();
gson.fromJson(String json,ClassBean.class);
2)解析数组
Type  type = new TypeToken<List<Class<T>>>{}.getType();
gson.fromJson(String json,type);
3.FastJson:  Alibaba提供的一个JSON解析的工具了
添加依赖   compile 'com.alibaba:fastjson:1.2.44'
1).解析对象
JSON.parseJson(String json,ClassBean.class);
2).解析数组
JSON.paseArray(tring json,ClassBean.class);


八、第八天 Assets+ ScrollView
Assets : 原始资源目录 ,该文件夹下的资源不会被编译生成id 。 所以不能通过R.id.的
方式来调用。
1.获取资源方式:  getAssets() 方法获取AssetsManager对象
2.manager.open(“文件名”)来打开一个资源目录 ,返回值是一个inputStream
3.Assets文件夹的创建
在Project模式下 找到相应的Modeul-src-main-右键-new-folder-Asstes Folder
ScrollView: 可纵向滚动的视图    -  嵌套LinearLayout 纵向的时候
HorizontalScrollView:  水平方向的滚动视图 -  嵌套LinearLayout横向的时候
1.这两个视图只能有一个直接子视图!
2.监听器 OnScrollChangedListener
3.ScrollView.FOCUS_UP表示滚动到了顶部
4.ScrollView.FOCUS_DOWN 表示滚动到了底部
5.scrollTo(x,y)  滚动到某个坐标点位置
6.smoothScrollTo(x,y) 平滑的滚动到某个坐标点位置
7.scrollBy(x,y)滚动多少距离  从当前的位置
8.smoothScrollBy(x,y)平滑的滚动多少距离
九、Spinner
Spinner 下拉列表框
1.spinnerMode:  dropDown /  dialog  下拉列表框的显示模式
2.entries:  数据源  必须是  res/values/strings.xml里面的 string数组 
3.backgroundWidth - 
。。
Spinner 点击事件  Spinner.setOnItemSeletedListener
MVC:  model  -  View  - Control 
Adapter  适配器:  将数据填充到 适配视图
ArrayAdapter:  数组适配器
1.重点:   1)只能填充String类型的数组或者集合数据作为数据源
2)每个展示数据的条目视图只能是一个TextView   (自定义条目布局的根标签必须是TextView)
2.构造方法: 
1)new ArrayAdapter(Context context,int  LaoyoutId,Collection<String>);
    参数1:上下文对象,参数2:条目布局Id ,参数3:数据源
3.常用方法:
1)adapter .add()  
2)adapter.remove()
3)adapter.notifyDataSetChanged() 当数据源发生改变的时候  刷新列表视图
...
SimpleAdapter:简单适配器
1.构造方法只有一个:
new SimpleAdapter(Context context,List<Map<String,T> list,int layoutId,String[] from,  int[] to);
参数1:上下文对象;
参数2: 数据源- 该数据源必须是   List<Map<String,Object> list 类型
参数3: 条目布局Id
参数4:数据源中每个Map集合中 key 的String[] 
参数5:是布局对应显示Map集合中Value 的视图Id
十、AsyncTask 异步任务
Android在开发过程中遵循单线程模型。 所以需要异步来做一些事情
重点:主线程不能访问网络,子线程不能更新UI
AsyncTask:抽象类,使用的时候必须实现其子类
1.三个泛型<Params,Progress,Result> 
1)params一般 是用于表示 想要访问的路径或者URl  一般是String类型
   同时。也是 四个重写方法中 doInbackground方法的参数类型
2)Progress 表示进度,一般使用Integer类型 
   同时。也是四个重写方法中  onProgressUpdata方法的参数
   当在doInbackground方法中调用publishProgress方法的时候onProgressUpdata方法会执行
3)result 表示异步任务工作的结果值类型  可以是String ,Object,Bitmap等等
   同时。也是doInBackground方法的返回值类型 也是 onPostExcute方法的参数类型
2.四个重写方法
1)onPreExcute(): 当异步任务启动的时候第一个执行的方法,该方法在主线程中,用于准备开始任务
显示进度条等等
2)doInBackground():当onPreExcute执行结束后 ,执行该方法。该方法在子线程中,用于做耗时
操作或访问网络等等。该方法中调用publishProgress方法会执行onProgressUpData方法
当doInBackground执行结束的时候会执行onPostExcute来更新UI
3)onProgressUpData()
当在doInBackground方法中调用了publishProgress的时候 该方法会执行,
该方法在主线程,一般用于更新进度条
4)onPostExcute()
当doInBackground方法工作执行完成后 ,会执行该方法来更新UI,doInBackground
的返回值就是这个方法的参数
3.一个启动方法
new MyTask().excute();   无参  有参数就是 URL  String类型的地址
4.一个取消方法
cancel
5.每一个Task的实例只能excute启动执行一次!
6.原理:Thread+Handler
十一、Handler
Handler: 线程间消息通讯机制
Handler:用于发送消息,
1.实例化 Handler handler = new Handler(){
handleMessage(Message msg){
  // 用于接收消息的方法
}
}
2.发送方法: handler.sendMessge(Message msg);
handler.sendMessgeDelayed(Message msg,long millin);
handler.sendMessgeAtTime(Message msg,long millin);
handler.sendEmptyMessge(int what);
handler.sendEmptyMessgeDelayed(int what,long millin);
handler.sendEmptyMessgeAtTime(int what,long millin);
handler.post(Runnable)
  handler.postDelayed(Runnable)
handler.postAtTime(Runnable)
总结:最终调用的都是 handler.sendMessgeAtTime(Message msg,long millin);
Message:消息对象 数据的载体
1.消息池,系统维护一个50个消息上线的 消息池,我们可以通过Message的静态方法 Obtain来
从消息池中获取消息对象
当调用了消息的recycle方法的时候会将消息对象送回消息池中
2.what: int类型用于标记区分 消息对象是哪一个  消息类型
   arg1:arg2:   用于携带int类型数据的常量
   obj  : 用于携带任意对象类型的数据
   target:   谁发送了这个消息  target就是谁   Handler 类型
   。。。。
MessageQueue:消息队列 ,当Handler发送了消息之后 消息会进入到消息队列中, 在消息队列里面
1.MessageQueue.enqueueMessage将消息压入消息队列中
2.MessageQueue.next()方法 是从消息队列中获取 消息对象
Looper:消息泵,用于提供消息队列运转的动力
1.looper.preparedMainLooper()  准备一个主线程的Looper(默认准备 不需要我们调用)
2.looper.prepare() 准备一个子线程的looper(默认不准备 如果需要 则调用)
3.looper.loop(); 该方法中存在一个无限的for循环,提供了MessageQueue的循环动力
4.looper.myLooper(); 获取当前线程的Looper 对象
5.ThreadLocal  本地线程变量 确保每个线程有且只有一个Looper
消息通讯机制的原理:
1.在主线程中实例化Handler对象,在子线程中获取数据,将数据使用message进行打包,在使用Hanlder
将消息发送出去,handler最终调用的是 Handler.sendMessageAtTime(Message)然后调用的 handler.equeueMessage方法通知消息队列MessageQueue 然后MessageQueue调用equeueMessage
方法将Message对象压入消息队列中,此时,Looper消息泵提供了无限循环的动力,不断的使用 MessageQueue调用next方法来获取其中的每一个Message对象,然后使用Message对象的target属性 也就是(Handler),来进行对这个消息的分发 dispatchMessage ,该分发方法中有一个回调方法,也就是
handleMsessage方法   此时消息就被传递到了主线程
十二、Http:
Http:超文本传输协议
HttpUrlConnection: 用于网络获取数据

URL  url = new URL(String path);
HttpUrlConnection  conn =(HttpUrlConnection)url.openConnection();
conn.setRequestMethod("GET/POST");
conn.setReadTimeOut();
conn.setConnectTimeOut();
conn.connect()
if(conn.getRequestCode == 200){
InputStream  inputStream =conn.getInputStream();
//将InputStream对象转换成为一个 需要的结果值对象。
}
十三、ListView
ListView 列表视图 可塑性特别强大!
BaseAdapter: 是 ArrayAdapter和SimpleAdapter 的父类
1.重写方法
1)getCount()   获取条目数据总长度
2)  getItem(int position)  获取position位置的条目对象
3)  getItemId(int position) 获取position位置的 id
4)  getView(int position,View convertView, ViewGroup parent) 获取position位置的视图
2)ListView.setAdapter(new Adapter());
3)  LayoutInflater 布局加载器: 是将xml 布局文件转换成为一个 View视图对象
LayoutInflater.from(Context).inflate(R.layout.xxx,parent,false);
ListView优化:
1.ListView 在布局文件中高度必须设置固定值(100dp/ match_parent)
2.ListView 的适配器 要重用convertView  可重用视图
3.使用 ViewHolder 视图持有者减少findViewById的使用
4.在滚动的时候不要加载图片
5.在getView 方法中不要做业务逻辑复杂的操作
6.数据量过多的时候  将展示进行分页。
。。。
ListView分页:
1. 当ListView 滑动到底部的时候再去加载更多一页的数据
2.如何判断滑动到底部
1)ListView 添加监听器 setOnScrollChangedListener
重写方法:可进行判断 (看代码)
ListView多布局:
1.在BaseAdapter中 添加两个重写方法
1)getItemType
2)getItemTypeCount
2.在getView方法中根据数据源的type 不同去加载不同的 条目布局即可
ListView的点击事件  setOnItemClickListener
ListView添加头尾布局   listView.addHeaderView
     listView.addFooterView
十四、GridView
ListView 怎么用  GridView怎么用
1.特殊属性:
1)columNum:  表示有显示多少列
2)verticalSpacing  行间距
3)gorizontalSpacing 列间距
2.GridView的点击事件  setOnItemClickListener