android复习点。

 

一.五大存储

1. SQLite轻量级嵌入式数据库引擎,支持sql语言(常被使用)

android为此数据库提供了一个名为SQLiteDatabase的类,封装操作数据库的API

execSQL()rawQuery()方法

ExecSQL()方法可以执行insertdeleteupdate

RawQuery()方法select

2. SharedprefereceXML形式存储(轻量级)

可以存储string/int/boolean/float/long

主要处理的key-value

本身是接口,不能直接创建实例

本身并没有提供写入数据和读取数据的能力。

3. File文件类存储:(内部存储方式)存储大数量的数据,缺点是更新数据困难。

Activity提供了openFileOutput()方法可以用于把数据输出到文件中。

文件一般是用来存放大量数据的,如文本、图本、音视频等。

4. ContentProvider

Android系统中能实现所有应用程序共享的一种数据存储方式。

每个contentprovider都会对外提供一个公共的uri(包装成uri对象),如果应用有数据需要共享时,就需要用contentprovider为数据定义uri,然后通过contentprovider传入这个uri来操作。

5. 网络存储:  与后台进行数据交互的一种方式。

 

二.RadioGroupFragmentFragmentTabHost

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

三.ListviewRecyclerView完成上下拉。

区别:

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中可以通过Androiddivder属性来为两个item设置分割线。 recyclerview必须使用recyclerview.itemDecoration这种实现方式,不 仅更灵活,而且样式丰富。

6. Listview中存在adapter.onitemclicklistener接口,用来绑定条目的点击事件。但在recyclerview中,并没有提供这样的接口,我们需要自己添加监听接口。

 

四.网络数据传输、XMLJSON的解析

五.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来做唯一的标识数据集,这里的URIcontent://作为前缀,表示该数据使用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:循环器,扮演messageQueuehandler之间桥梁的角色,循环取出 messageQueue里面的message并交付给相应的handler进行处理。

2. Handlerhandlermessage的主要处理者,负责将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) 接口和方法前面不要加访问权限修饰符:publicprivate等。也不能使用staticfinal

(3) AIDL默认支持的类型包括Java基本类型,String,list,map,charsequence,除此之外其他类型都需要import声明。

十.APP的性能优化、内存优化

1. android  OOM(内存溢出)

(1) Android系统的每个进程都有一个最大内存限制,如果申请的内存资源超过这个限制,系统就会抛出OOM错误

(2) 内存溢出的原因以及解决办法:

① 图片过大:通过等比例缩放图片、对图片采用软引用,及时进行recycle()操作、使用框架加载图片(比如GlideFrescoPicasso等)

② 界面横竖屏切换:直接把XML配置成view再放到一个容器里面,避免重复加载,在页面加载时避免重复使用一些代码。

③ 查询数据库有没有关闭游标。

④ 构造Adapter时,没有使用convertviewsetTag()getTag()

⑤ Bitmap对象不再使用时调用recycle()来释放对象。

⑥ 

2. android  内存泄露:

(1) 垃圾回收器无法回收原本应该被回收的对象,这个对象就引起了内存泄露。

(2) 如何杜绝:Context、内部类(handler等)、Cursoradapterbitmap

(3) 内存泄漏的危害:

① 过多的内存泄漏会造成内存溢出(oom)。

② 内存泄露导致内存不足,会频繁的触发GC(垃圾回收机制),不管是android2.2以前的单线程GC还是现在的CMSG1,都有一部分的操作会导致用户线程停止(就是所谓的Stop the world),从而导致UI卡顿。

3. 如何避免内存泄漏?

(1) 使用ArrayMap/SparseArray来代替HashMap,AarrayMap/SparseArray是专门为移动设备设计的高效的数据结构。

(2) 太多了附上网址吧http://blog.csdn.net/mxm691292118/article/details/51020023

十一.事件分发机制

1. 事件分发流程:ActivityViewGroupView

2. 核心方法:

(1) dispatchTouchEvent()(分发)

(2) onTouchEvent()(结束)

(3) onInterceptTouchEvent()(拦截)

3. 当一个点击事件发生时,首先是先传到activitydispatchTouchEvent()进行事件分发;

4. http://blog.csdn.net/carson_ho/article/details/54136311(网址详解)

十二.三方登录、三方SDK

1.三方SDK

(1)百度地图、高德地图、腾讯地图、sharedsdkjpush极光推送、环信、融云、腾讯云通信、7牛云、微信支付、支付宝支付、友盟统计 分享 登录 推送、讯飞语音识别。

十三.图片压缩,图片缓存

1.图片的三级缓存

2.图片压缩:

(1).质量压缩:不会改变图片的像素,改变的是图片的位深及透明度等。

(2).采样率压缩:

(3).缩放法压缩:

(4).RGB_565法压缩:

(5).createScaledBitmap:

 

十四.界面UI框架:SlidingMenu,PulltoRefresh,MaterialRefreshlayout,SwipeToLoadLayout等。

十五.网络框架:okhttpvolley、(最早的两个:httpclientxutils

(xutils又分为:httputils.BitmapUtilsdbutilsviewutils

OkHttp:

优点:1.支持http请求,https请求;

2. 支持文件下载;

3. 使用的是httpURLConnection,不需要担心android版本的变更。

4. 支持getpost请求

5. 基于http文件的上传。

6. 加载图片

缺点:比如callback回来是在线程里面,不能刷新UI,需要我们手动处理;

封装会比较麻烦。

Volley

优点:1.特别适合数据量小,但通信频繁的网络操作。

2. 内部分装了异步线程。

3. 支持getpost请求。

4. 图片下载。

5. 可以直接在主线程调用服务器端并处理返回的结果。

6. 可以取消请求,容易扩展,面向接口编程。

缺点:1.对大文件下载Volley的表现非常糟糕。

2. 只支持http请求。

3. 图片加载性能一般。

4.使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。

十六.图片加载框架picassoFrescoGlide

特点

1. Glide更容易用,因为glidewith方法不光接受Context,还接受activity fragmentcontext会自动的从他们获取。同时将ActivityFragment作为 with 参数的好处是:图片加载会和activityfragment的生命周期保持一致, 比如paused状态在暂停加载,在Resumed的时候又会重新加载。所以传参的 时候建议传递activityfragmentglide,而不是给Context

2. Glide加载的图片质量要差于Picasso,因为glide默认的格式是RGB_565,比如 ARGB_8888格式的内存开销的一半。

3. PicassoGlide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸。

glide缓存的是跟imageview一样大小的。glide的这种方法优点是加载显示 很快。而Picasso则需要在显示之前调整一次大小而有些延迟。

4. gilde能加载GIF动态图,而Picasso不能。

5. Picassosquare的网络库一起能发挥最大作用。因为Picasso可以选择将网 络请求的缓存部分交给okhttp实现。

总结:Picasso所能实现的功能,gilde都能做,无非就是所需设置不同。但是Picasso体积比glide小太多,如果项目中网络请求本身用的就是okhttp或者retrofit,那么建议用Picasso,体积会小很多。glide的好处就是大型的图片流,比如gifvideo,如果做美拍、爱拍这种视频软件,建议使用。

Fresco5.0以下的内存优化非常好,代价就是体积也非常的大,按照体积计算的话:Fresco>glide>Picasso不过在使用起来也有些不便。

十七.版本控制工具SVNGit

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文件对应的就是MVCview层;而各种java bean还有一些数据相关的类就对应model层,至于controller层就是各种activity

2. MVP

1. 对于android来说,mvpmodel层相对于mvc是一样的,而activityfragment不再是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.ANRApplication Not Responding

(一:)ANR一般有三种类型:

(1)KeyDispathTimeout(主要类型):按键或触摸事件在特定时间内无响应。

(2)BroadccastTimeoutBroadcastReceiver在特定时间内无法处理完成。

(3)ServiceTimeoutService在特定的时间内无法处理完成。

(二:)如何避免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对象。   

三十九:支付宝支付:

        有公钥和私钥;  公钥是发给服务器,私钥发送给后台发送数据用的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值