一.五大存储
1. SQLite:轻量级嵌入式数据库引擎,支持sql语言(常被使用)
android为此数据库提供了一个名为SQLiteDatabase的类,封装操作数据库的API。
execSQL()和rawQuery()方法
ExecSQL()方法可以执行insert、delete、update。
RawQuery()方法select。
2. Sharedpreferece:以XML形式存储(轻量级)
可以存储string/int/boolean/float/long
主要处理的key-value队
本身是接口,不能直接创建实例
本身并没有提供写入数据和读取数据的能力。
3. File文件类存储:(内部存储方式)存储大数量的数据,缺点是更新数据困难。
Activity提供了openFileOutput()方法可以用于把数据输出到文件中。
文件一般是用来存放大量数据的,如文本、图本、音视频等。
4. ContentProvider:
Android系统中能实现所有应用程序共享的一种数据存储方式。
每个contentprovider都会对外提供一个公共的uri(包装成uri对象),如果应用有数据需要共享时,就需要用contentprovider为数据定义uri,然后通过contentprovider传入这个uri来操作。
5. 网络存储: 与后台进行数据交互的一种方式。
二.RadioGroup、Fragment、FragmentTabHost
1.https://www.jianshu.com/p/a663803b2a44
2.Fragment:
(1).FragmentPagerAdapter与FragmentStatePagerAdapter的区别:
FragmentPagerAdapter适应于页面较少的情况,而FragmentStatePagerAdapter适应于页面较多的情况,在FragmentStatePagerAdapter的源码中destroyItem()方法中有.remove(fragment),这说明释放了内存 ,说明它比FragmentPagerAdapter更节省内存。FragmentStatePagerAdapter每次切换界面时,是回收内存的。
(2)Fragment通信:
第一种:在Fragment中调用Activity中的方法;getActivity
第二种:在Activity中调用Fragment中的方法;接口回调
第三种:在Fragment中调用Fragment中的方法;先getActivity然后再findFragmentById
三.Listview和RecyclerView完成上下拉。
区别:
1.对于listview来说,通过创建viewholder来提升性能并不是必须的;
使用recyclerview的时候,adapter必须实现一个viewholder。
2. 定制item条目时,listview只能实现垂直线性排列的列表视图;
Recyclerview可以通过设置recyclerview.layoutmanager来定义不同的视图
(比如水平滚动列表,不规则的瀑布流列表)。
3. Listview中没有提供任何方法或接口来实现item动画。Recyclerview可以通过设置recyclerview.itemAnimator来增加item动画。
4. 在listview中针对不同数据封装了各种类型的adapter,比如arrayadapter。 而在recyclerview中必须自定义recyclerview.adapter为其提供数据集合。
5. Listview中可以通过Android:divder属性来为两个item设置分割线。 而recyclerview必须使用recyclerview.itemDecoration这种实现方式,不 仅更灵活,而且样式丰富。
6. Listview中存在adapter.onitemclicklistener接口,用来绑定条目的点击事件。但在recyclerview中,并没有提供这样的接口,我们需要自己添加监听接口。
四.网络数据传输、XML和JSON的解析
五.Android四大组件:
1.Activity:
(1)一个activity通常就是一个单独的屏幕(窗口)
(2)Activity之间用Intent通信。
(3)Android每个应用都需要在配置清单中注册。
2.Service:
(1)Service用于在后台完成用户指定的操作。
(2)Started(启动):应用程序组件(如activity)调用startService()方法启动。(非绑)
(3)Bound(绑定):应用程序组件调用bindservice()方法绑定.
如何与activity通信:通过startService里面的Intent方法;通过bindService里面的binder方法、通过广播的形式。
(4)绑定和非绑定的区别:
①Startedservice是由其他组件调用startservice()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使是启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopself()方法停止,或者由其他组件调用stopservice()方法停止。
②使用bindservice()方法启动服务,调用者与服务绑定了在一起,调用者退出,服务终止。
(5)使用Service时,必须要在配置清单中注册。<service></service>标签。
(6)Service通常位于后台运行,它一般不需要与用户交互,因此service没有图形用户界面。
(7)Service组件需要继承service基类。
(8)Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
3.Content provider:
(1)Android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过contentResolver类从该内容提供者中获取或存入数据。
(2)只有需要在多个应用程序间共享数据时才需要内容提供者。例如,通讯录被多个应用程序使用,且必须存储在一个内容提供者。它的好处是统一数据访问方式。
(3)ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不用应用程序共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
(4)开发人员不会直接使用contentprovider类的对象,大多数是通过contentresolver对象实现对contentprovider的操作。
(5)Contentprovider是使用URI来做唯一的标识数据集,这里的URI以content://作为前缀,表示该数据使用contentprovider来管理。
4.Broadcast receiver:
(1)广播接收器也没有用户界面。然而,他们可以启动一个activity或者service来响应它们收到的消息,或者NotificationManager来通知用户。通知有很多方式吸引用户,比如震动,闪灯,声音等。
(2)广播有两种注册方式:动态注册和静态配置清单注册。
①动态注册特点:当用来注册的activity关闭后,广播也就失败了。
②静态注册特点:无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开的。也就是说哪怕app没有启动,该app订阅的广播在触发时也会对它起作用。
5.四大组件的激活:
(1)除了内容提供者需要接收到contentresolver发出的请求后才能被激活。其它的三种都是被intent的异步消息所激活。
6.四大组件的关闭:
(1)因为内容提供者和广播接收器都需要被激活,所以没有必要显示的关闭这些组件。
(2)Activity关闭可以用finish()方法
(3)Service关闭可以bindservice()或者stopservice()。
六.IO流以及文件开发,Android多媒体图片、视频、动画。
七.Handler机制:
1. Looper:循环器,扮演messageQueue和handler之间桥梁的角色,循环取出 messageQueue里面的message并交付给相应的handler进行处理。
2. Handler:handler是message的主要处理者,负责将message添加到消息队列以及 对消息队列中的message进行处理。
3. Message:消息,理解为线程间通讯的数据单元。
4. Message Queue:消息队列,用来存放通过Handler发布的消息,按照先进先出执 行。
总结:handler负责发送消息,Looper负责接收handler发送的消息,并直接把消息回 传给handler自己,messagequeue就是一个存储消息的容器。
八.AsycnTask框架使用:
1. onPreExecute(); 用于在执行后台任务前做一些UI操作。
doInBackground(); 方法内部执行后台任务,不可再次方法内修改UI。
onProgressUpdate();用于更新进度信息。
onPostExecute(); 用于在执行完后台任务后更新UI,显示结果。
九.AIDL进程间通信:
1. 编写AIDL需要注意的事件:
(1) 接口名词需要与aidl文件名相同
(2) 接口和方法前面不要加访问权限修饰符:public、private等。也不能使用static、final
(3) AIDL默认支持的类型包括Java基本类型,String,list,map,charsequence,除此之外其他类型都需要import声明。
十.APP的性能优化、内存优化。
1. android OOM:(内存溢出)
(1) Android系统的每个进程都有一个最大内存限制,如果申请的内存资源超过这个限制,系统就会抛出OOM错误
(2) 内存溢出的原因以及解决办法:
① 图片过大:通过等比例缩放图片、对图片采用软引用,及时进行recycle()操作、使用框架加载图片(比如Glide、Fresco、Picasso等)
② 界面横竖屏切换:直接把XML配置成view再放到一个容器里面,避免重复加载,在页面加载时避免重复使用一些代码。
③ 查询数据库有没有关闭游标。
④ 构造Adapter时,没有使用convertview:setTag()、getTag()。
⑤ Bitmap对象不再使用时调用recycle()来释放对象。
⑥
2. android 内存泄露:
(1) 垃圾回收器无法回收原本应该被回收的对象,这个对象就引起了内存泄露。
(2) 如何杜绝:Context、内部类(handler等)、Cursor、adapter、bitmap;
(3) 内存泄漏的危害:
① 过多的内存泄漏会造成内存溢出(oom)。
② 内存泄露导致内存不足,会频繁的触发GC(垃圾回收机制),不管是android2.2以前的单线程GC还是现在的CMS和G1,都有一部分的操作会导致用户线程停止(就是所谓的Stop the world),从而导致UI卡顿。
3. 如何避免内存泄漏?
(1) 使用ArrayMap/SparseArray来代替HashMap,AarrayMap/SparseArray是专门为移动设备设计的高效的数据结构。
(2) 太多了附上网址吧http://blog.csdn.net/mxm691292118/article/details/51020023
十一.事件分发机制
1. 事件分发流程:Activity—ViewGroup—View;
2. 核心方法:
(1) dispatchTouchEvent()(分发)
(2) onTouchEvent()(结束)
(3) onInterceptTouchEvent()(拦截)
3. 当一个点击事件发生时,首先是先传到activity的dispatchTouchEvent()进行事件分发;
4. http://blog.csdn.net/carson_ho/article/details/54136311(网址详解)
十二.三方登录、三方SDK
1.三方SDK:
(1)百度地图、高德地图、腾讯地图、sharedsdk、jpush极光推送、环信、融云、腾讯云通信、7牛云、微信支付、支付宝支付、友盟统计 分享 登录 推送、讯飞语音识别。
十三.图片压缩,图片缓存
1.图片的三级缓存
2.图片压缩:
(1).质量压缩:不会改变图片的像素,改变的是图片的位深及透明度等。
(2).采样率压缩:
(3).缩放法压缩:
(4).RGB_565法压缩:
(5).createScaledBitmap:
十四.界面UI框架:SlidingMenu,PulltoRefresh,MaterialRefreshlayout,SwipeToLoadLayout等。
十五.网络框架:okhttp、volley、(最早的两个:httpclient、xutils)
(xutils又分为:httputils.BitmapUtils、dbutils、viewutils)
OkHttp:
优点:1.支持http请求,https请求;
2. 支持文件下载;
3. 使用的是httpURLConnection,不需要担心android版本的变更。
4. 支持get,post请求
5. 基于http文件的上传。
6. 加载图片
缺点:比如callback回来是在线程里面,不能刷新UI,需要我们手动处理;
封装会比较麻烦。
Volley:
优点:1.特别适合数据量小,但通信频繁的网络操作。
2. 内部分装了异步线程。
3. 支持get,post请求。
4. 图片下载。
5. 可以直接在主线程调用服务器端并处理返回的结果。
6. 可以取消请求,容易扩展,面向接口编程。
缺点:1.对大文件下载Volley的表现非常糟糕。
2. 只支持http请求。
3. 图片加载性能一般。
4.使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。
十六.图片加载框架picasso、Fresco、Glide。
特点:
1. Glide更容易用,因为glide的with方法不光接受Context,还接受activity和 fragment,context会自动的从他们获取。同时将Activity和Fragment作为 with 参数的好处是:图片加载会和activity、fragment的生命周期保持一致, 比如paused状态在暂停加载,在Resumed的时候又会重新加载。所以传参的 时候建议传递activity和fragment给glide,而不是给Context。
2. Glide加载的图片质量要差于Picasso,因为glide默认的格式是RGB_565,比如 ARGB_8888格式的内存开销的一半。
3. Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸。
而glide缓存的是跟imageview一样大小的。glide的这种方法优点是加载显示 很快。而Picasso则需要在显示之前调整一次大小而有些延迟。
4. gilde能加载GIF动态图,而Picasso不能。
5. Picasso和square的网络库一起能发挥最大作用。因为Picasso可以选择将网 络请求的缓存部分交给okhttp实现。
总结:Picasso所能实现的功能,gilde都能做,无非就是所需设置不同。但是Picasso体积比glide小太多,如果项目中网络请求本身用的就是okhttp或者retrofit,那么建议用Picasso,体积会小很多。glide的好处就是大型的图片流,比如gif,video,如果做美拍、爱拍这种视频软件,建议使用。
Fresco在5.0以下的内存优化非常好,代价就是体积也非常的大,按照体积计算的话:Fresco>glide>Picasso不过在使用起来也有些不便。
十七.版本控制工具SVN、Git
1.Git:首先把代码下载下来然后创建自己的分支,然后下班的时候该提交合并。
需要用到的命令:
(1)git branch分支名(创建分支)
(2)git checkout 分支名(进入分支)
(3)git checkout -b 分支名(创建并且进入分支)
(4)git add.(添加更新)
(5)git commit -m 信息(提交更改)
(6)git push(往代码仓库提交代码)
(7)git pull(从仓库下拉代码)
(8)git merge 分支名(合并分支)
十八.抓包工具Fiddler的使用
十九.MVP、MVC
1.MVC:
1.mvc是软件架构中最常用的一种框架,简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示。
2.比如用户出发事件的时候,view层会发送指令到controller,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上,这就是MVC的工作原理。
3.对于原生的android项目来说,layout.xml文件对应的就是MVC的view层;而各种java bean还有一些数据相关的类就对应model层,至于controller层就是各种activity。
2. MVP:
1. 对于android来说,mvp的model层相对于mvc是一样的,而activity和fragment不再是controller层,而是纯粹的view层,所有关于用户事件的转发全部交由presenter层处理。
2. 与mvc最明显的差别就是view层和model层不在相互可见,完全的解耦,mvc中的view会直接从model中读取数据而不是通过controller;取而代之的presenter层充当了桥梁的作用,用于操作view层发出的事件传递到presenter层中,presenter层去操作model层,并且将数据返回给view层,整个过程中view层和model层完全没有联系。
二十.设计模式之单例模式、工厂模式、代理模式、观察者模式、装饰器模式。
设置模式六要素:单一职责原则、开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、迪米特法则。
1.单例模式:实现单例模式有以下几个关键点:
(1)构造函数不对外开放,一般为Private;
(2)通过一个静态方法或者枚举返回单例类对象;
(3)确保单例类的对象有且有一个,尤其要注意多线程的场景
(4)确保单例类对象在反序列化时不会重新创建对象;
2.单例模式的七种实现方式:
(1)懒汉式(线程不安全):私有的构造方法、私有的全局静态变量、共有的静态方法。解决的方法就是使用synchronized关键字
(2)懒汉式(线程安全):私有的静态变量、私有的构造方法、共有的同步静态方法。这种单例实现方式的getInstance()方法中添加了synchronized关键字,也就是告诉java(JVM)getInstance是一个同步方法。但是它的缺点在于每次调用getInstance()都进行同步,造成了不必要的同步开销。(不建议使用这种模式)
(3)饿汉模式(线程安全):在类初始化时,已经自行实例化;static修饰的静态变量在内存中一旦创建,便永久存在。
(4)DCL双重校验模式:这种模式的亮点是在getInstance()方法上,其中对singleton进行了两次判断是否为空,第一层判断是为了避免不必要的同步,第二层的判断是为了在null的情况下才创建实例。
(5)静态内部类单例模式:当第一次加载singleton类的时候并不会初始化INSTANCE,只有第一次调用singleton的getinstance()方法时才会导致INSTANCE被初始化。
(6)枚举单例:最大的优点就是写法简单,默认枚举实例线程是安全的,并且在任何情况下都是一个单例。即使是在反序列化的过程,枚举单例也不会重新生成新的实例。
(7)使用容器实现单例模式:使用HashMap作为缓存容器,第一次存入Map,返回与Key相对应的对象。
3.工厂模式:
(1)简单工厂模式:一个具体工厂类负责生产所有的具体产品。客户端只需要关注生成的具体产品。
优点:客户端需要什么产品,可以直接得到,逻辑判断在工厂类里面。
缺点:扩展性一般,产品都是下一个产品族下面的产品,对于不在产品族里的产品没法去扩展;另外获得具体某种产品的逻辑放在工厂里面,新添加的产品就需要去工厂里面修改代码 。
(2)工厂方法模式:一个抽象产品派生出去多种具体的产品的;一个抽象工厂派生出去多种生产产品的工厂类;一个具体的工厂负责生产一种具体的产品。
优点:扩展性,能够处理不同产品系列的产品 ,通过具体的工厂去生产不同的产品,扩展性较好。
缺点:类的个数较多。而且一个工厂只能生产一个具体的产品。
(3)抽象工厂模式:多个抽象产品类,每个抽象产品类能派生出多个具体产品类,一个抽象工厂类可以派生出多个具体工厂类;每个具体工厂类可以创建多个具体产品类的实例。
4.观察者模式(Observer):
(1)定义:观察者模式定义了一个一对多的依赖关系,让多个观察者对象同时监听一个主题对象;当这个主题对象改变时,会通知所有的观察者,让他们能够自动的更新自己。
(2)观察者模式的组成:
抽象主题:把所有的对观察者对象的引用保存在一个集合中,抽象主题提供一个接口,可以注册和移除观察者;
抽象观察者:为所有的观察者定义一个接口,当主题的数据更新时给登记的观察者提供通知;
具体主题:在具体主题内部状态改变时,给所有登记过的观察者发出通知;
具体观察者:实现抽象观察者提供的更新接口,以便本身的状态能够及时更新;
5.代理模式(Proxy Pattern也成为委托模式):
定义:为其他对象提供一种代理以控制这个对象的访问。
动态代理:使用反射可以解决加载到哪个代理类问题,避免每个代理类都要重复写的问题;
静态代理:后期扩展和维护比较困难,因为代码写的太死,没有可以替换的余地;
二十一.UDP和TCP:
1.区别:
(1)Udp传输速度比tcp快,但没有tcp安全,因为tcp传输时需要三次握手(面向性链接);
(2)Udp是将数据打包发送到服务器上面,然后客户端自行去下载,如果丢包的话,服务器不负责(网络不好时容易丢包);
(3)Tcp相对于udp比较安全,经过三次握手几乎可以完全避免丢包的情况,但传输速度比较慢;
(4)一般聊天使用tcp,视频语音之类使用udp;
(5)Tcp占用资源比较多(三次握手),用时较长。Udp占用资源比较少。
(6)Tcp可以保证数据传输的顺序,udp不能。
(7)Tcp只能一对一链接,udp可以一对一和一对多传输。
(8)tcp的优点:可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
(9)tcp的缺点:传输速度慢,效率低,占用系统资源高, TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。。
(10)udp的优点: 传输速度快,UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。
(11)udp的缺点:不可靠,不稳定,容易丢包,因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
二十二.Https协议:
1.属于传输层,面向性链接,安全。
2.Https协议握手:客户端向服务端发送数据,服务端通多私钥解密,然后验证如果一致,发送一段加密的数字串给客户端,客户端解密验证没问题后,建立连接,开始传送数据,发送完毕,服务器给客户端发送字符串,断开连接。
3.Okhttp:默认情况下支持https协议的网站,https一般都是有安全证书的,比较安全
二十三.热修复框架。
1.AndFix
2.Tinker
二十四.消息框架。
1.Retrofnt eventbus
2.rxjava
二十五.UI框架。
1.Pulltorefreshlayout
2.Slidingmenu
3.Photoview
4.Gifview
5.Android_imgage_slider
6.MpChartView 表格图 折线图 并行图
7.Viewpager indiactor
8.Stiky-nav-layout(鸿洋)
9.Swipetoloadlayout
10.Xrecyclerview
11.Recyclerview 分割线
12.heartlayout
二十六.音视频框架。
1.Zxingvitamio
2.Ijkplayer
3.Exoplayer
4.ffmpeg
二十七.插件化。
1.Small
二十八.数据库框架:greendao
二十九.其他:face 面部识别。
三十.线程的生命周期(状态):
1.新建(New)
2.就绪(Runnable)
3.运行(Running)
4.堵塞(Blocked)
5.死亡(Dead)
三十一.混合开发
http://blog.csdn.net/qq122627018/article/details/52207600;
三十二.Java算数排序
1.八大排序算法:
(1)内部排序:(使用内存)
①插入排序:直接插入排序、希尔排序。
②选择排序:简单选择排序、堆排序。
③交换排序:冒泡排序、快速排序。
④归并排序
⑤基数排序
(2)外部排序:(内存和外村结合使用)
三十三.Java字符串排序
1.自然顺序:str.compareTo("inc")
2.自然逆序:str.compareTo("dec")
3.忽略大小写顺序:str.compareTo("ncinc")
4.忽略大小写逆序:str.compareTo("ncdec")
三十四.Java判断字符串是否为空
1.str!=null;
2."".equals(str);
3.str.length()!=0;
三十五.应用程序闪退(crash)。
1.捕获导致闪退的异常
运行的android进程中存在一个UncaughtExceptionHandler对象(未捕获异常处理器),我们可以通过Thread类的静态方法setDefaultUncaughtExceptionHandler设置当前进程的UncaughtExceptionHandler对象。
当出现一个未捕获异常时,系统会调用出现异常的进程的UncaughtExceptionHandler对象的uncaughtException方法,也就是说在android应用闪退前我们可以在这个方法中获取引起闪退的异常信息。
UncaughtExceptionHandler是一个接口,其中只定义了一个uncaughtException方法。
2.第三方解决方案:
关于android应用的crash分析与处理,有很多成熟的第三方解决方案,比如Bugly,ACRA等。
三十六.应用程序无响应。
1.ANR(Application Not Responding)
(一:)ANR一般有三种类型:
(1)KeyDispathTimeout(主要类型):按键或触摸事件在特定时间内无响应。
(2)BroadccastTimeout:BroadcastReceiver在特定时间内无法处理完成。
(3)ServiceTimeout:Service在特定的时间内无法处理完成。
(二:)如何避免KeyDispathTimeout :
1. UI线程尽量只做跟UI相关的工作。
2. 耗时的工作(比如数据库操作,I/O,连接网络等都有可能阻碍UI线程操作)要把 它放入单独的线程处理。
3. 尽量用Handler来处理UIthread和别的thread之间的交互。
(三:)UI线程主要包括如下:
1.Activity:onCreate(),onResume(),onDestroy(),onKeyDown(),onClick()
2.AsynvTask:onPreExecute(),onProgressUpdate(),onPostExecute(),onCancel
3.Mainthread handler:handleMessage(),post*(runnable r)
4.other.
三十七.线程开启的方法:
1.继承thread类,重写run方法,然后创建对象。
2.实现Runnable接口,重写run方法,创建对象。
3.匿名内部类。
三十八. Java的反射:、
定义:java反射机制实在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能被称为java语言的反射机制。
反射就是把java类中的各种成分映射成一个个的java对象。
三十九:支付宝支付:
有公钥和私钥; 公钥是发给服务器,私钥发送给后台发送数据用的。