美文网首页
一些知识点的整理

一些知识点的整理

作者: 卡卡的箱子 | 来源:发表于2020-07-29 15:05 被阅读0次

    https://www.jianshu.com/p/dab1fcf0109d

    1、Activity生命周期?(只要页面不销毁,再次显示都会走onRestart方法,包含回退桌面再显示,跳转后再显示)


    44710A71-941A-4389-8395-AD960B7F29EE.png

    2、Service生命周期?
    startService() --> onCreate()--> onStartCommand()--> onDestroy()
    bindService-->onCreate()-->onBind()-->unBind()-->onDestroy()

    多次执行startService时回重复onStartCommand方法,和当前上下文无关
    多次执行bindService时不会走任何方法,和当前上下文生命联
    交叉调用startService,bindService时会按照他们各自原来的特征走,onCreate只执行一次,但是在没有unBindService时,调用stopService无效;只有在解绑之后才能onDestroy。

    3、Activity的启动过程
    https://blog.csdn.net/huangliniqng/article/details/89364064

    4、进程保活(不死进程)
    https://www.jianshu.com/p/dd01580743e7

    黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
    白色保活:启动前台Service
    灰色保活:利用系统的漏洞启动前台Service

    5、讲解一下Context
    Context是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。Context下有两个子类,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

    getApplicationContext()和getApplication()方法得到的对象都是同一个application对象,只是对象的类型不一样。

    Context数量 = Activity数量 + Service数量 + 1 (1为Application)

    6、理解Activity,View,Window三者关系

    7、四种LaunchMode及其使用场景
    此处延伸:栈(First In Last Out)与队列(First In First Out)的区别
    standard 模式
    singleTop 模式
    singleTask 模式
    singleInstance 模式

    8、View的绘制流程
    View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()

    9、View,ViewGroup事件分发

    10、保存Activity状态

    11、Android中的几种动画

    12、Android中跨进程通讯的几种方式

    13、AIDL理解
    14、Handler的原理
    15、Binder机制原理
    16、热修复的原理

    17、Android内存泄露及管理
    一、Handler 引起的内存泄漏。
    二、单例模式引起的内存泄漏。
    三、非静态内部类创建静态实例引起的内存泄漏。
    四、非静态匿名内部类引起的内存泄漏。
    五、注册/反注册未成对使用引起的内存泄漏。
    六、资源对象没有关闭引起的内存泄漏。
    七、集合对象没有及时清理引起的内存泄漏。

    18.垃圾回收

    19、Fragment与Fragment、Activity通信的方式

    20、Android UI适配

    21、app优化

    • app优化:(GPU过度绘制,GPU模式分析:红黄:布局优化;蓝绿:减少耗时操作)
    • App启动优化
      https://www.jianshu.com/p/e807bc7a5693
    • 布局优化
    • 性能优化
    • 响应优化
    • 内存优化
    • 电池使用优化(使用工具:Batterystats & bugreport)

    23、图片优化

    24、HybridApp WebView和JS交互

    25、JAVA GC原理
    https://blog.csdn.net/chrise_/article/details/80591821
    https://baijiahao.baidu.com/s?id=1636309817155065432&wfr=spider&for=pc

    26、ANR

    27、设计模式
    单例模式:分为饿汉式和懒汉式
    代理模式(动态代理 retrofit)
    观察者模式 (observe)
    https://www.jianshu.com/p/369052bce3b4

    28、RxJava

    29、MVP,MVC,MVVM
    此处延伸:手写mvp例子,与mvc之间的区别,mvp的优势

    30、手写算法(选择冒泡必须要会)

    32、JNI
    C函数接口就是这样:JNIEXPORT void JNICALL Java_NativeDemo_sayHello(JNIEnv *, jobject);
    这里起名字的方式比较特别,是:包名+类名+方法名。

    (1)安装和下载Cygwin,下载 Android NDK
    (2)在ndk项目中JNI接口的设计
    (3)使用C/C++实现本地方法
    (4)JNI生成动态链接库.so文件
    (5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可

    33、RecyclerView和ListView的区别

    RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平);
    RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了。
    RecyclerView可以进行局部刷新。
    RecyclerView提供了API来实现item的动画效果。
    在性能上:
    如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。
    如果只是作为列表展示,则两者区别并不是很大。

    34、Glide

    Glide 的内存缓存有个 active 的设计,从内存缓存中取数据时,不像一般的实现用 get,而是用 remove,再将这个缓存数据放到一个 value 为软引用的 activeResources map 中,并计数引用数,在图片加载完成后进行判断,如果引用计数为空则回收掉。内存缓存更小图片,Glide 以 url、view_width、view_height、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小与 Activity/Fragment 生命周期一致,支持 trimMemory。图片默认使用默认 RGB_565 而不是 ARGB_888,虽然清晰度差些,但图片更小,也可配置到 ARGB_888。

    42、Xutils, OKhttp, Volley, Retrofit对比

    Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的严重,一旦这个框架出现问题,那么对项目来说影响非常大的。、

    OKhttp:Android开发中是可以直接使用现成的api进行网络请求的。就是使用HttpClient,HttpUrlConnection进行操作。okhttp针对Java和Android程序,封装的一个高性能的http请求库,支持同步,异步,而且okhttp又封装了线程池,封装了数据转换,封装了参数的使用,错误处理等。API使用起来更加的方便。但是我们在项目中使用的时候仍然需要自己在做一层封装,这样才能使用的更加的顺手。

    Volley:Volley是Google官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持HttpClient、HttpUrlConnection, 甚至支持OkHttp,而且Volley里面也封装了ImageLoader,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,稍复杂点的需求还是需要用到专门的图片加载框架。Volley也有缺陷,比如不支持post大数据,所以不适合上传文件。不过Volley设计的初衷本身也就是为频繁的、数据量小的网络请求而生。

    Retrofit:Retrofit是Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架,RESTful是目前流行的一套api设计的风格, 并不是标准。Retrofit的封装可以说是很强大,里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然默认是用http ,可以使用不同Json Converter 来序列化数据,同时提供对RxJava的支持,使用Retrofit + OkHttp + RxJava + Dagger2 可以说是目前比较潮的一套框架,但是需要有比较高的门槛。

    Volley VS OkHttp

    Volley的优势在于封装的更好,而使用OkHttp你需要有足够的能力再进行一次封装。而OkHttp的优势在于性能更高,因为 OkHttp基于NIO和Okio ,所以性能上要比 Volley更快。IO 和 NIO这两个都是Java中的概念,如果我从硬盘读取数据,第一种方式就是程序一直等,数据读完后才能继续操作这种是最简单的也叫阻塞式IO,还有一种是你读你的,程序接着往下执行,等数据处理完你再来通知我,然后再处理回调。而第二种就是 NIO 的方式,非阻塞式, 所以NIO当然要比IO的性能要好了,而 Okio是 Square 公司基于IO和NIO基础上做的一个更简单、高效处理数据流的一个库。理论上如果Volley和OkHttp对比的话,更倾向于使用 Volley,因为Volley内部同样支持使用OkHttp,这点OkHttp的性能优势就没了, 而且 Volley 本身封装的也更易用,扩展性更好些。

    OkHttp VS Retrofit

    毫无疑问,Retrofit 默认是基于 OkHttp 而做的封装,这点来说没有可比性,肯定首选 Retrofit。

    Volley VS Retrofit

    这两个库都做了不错的封装,但Retrofit解耦的更彻底,尤其Retrofit2.0出来,Jake对之前1.0设计不合理的地方做了大量重构, 职责更细分,而且Retrofit默认使用OkHttp,性能上也要比Volley占优势,再有如果你的项目如果采用了RxJava ,那更该使用 Retrofit 。所以这两个库相比,Retrofit更有优势,在能掌握两个框架的前提下该优先使用 Retrofit。但是Retrofit门槛要比Volley稍高些,要理解他的原理,各种用法,想彻底搞明白还是需要花些功夫的,如果你对它一知半解,那还是建议在商业项目使用Volley吧。

    Java

    1、线程中sleep和wait的区别

    (1)这两个方法来自不同的类,sleep是来自Thread,wait是来自Object;
    (2)sleep方法没有释放锁,而wait方法释放了锁。
    (3)wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

    2、Thread中的start()和run()方法有什么区别

    start()方法是用来启动新创建的线程,而start()内部调用了run()方法,这和直接调用run()方法是不一样的,如果直接调用run()方法,
    则和普通的方法没有什么区别。

    3、关键字final和static是怎么使用的。

    final:
    1、final变量即为常量,只能赋值一次。
    2、final方法不能被子类重写。
    3、final类不能被继承。
    static:
    1、static变量:对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,
    在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
    2、static代码块
    static代码块是类加载时,初始化自动执行的。
    3、static方法
    static方法可以直接通过类名调用,任何的实例也都可以调用,因此static方法中不能用this和super关键字,
    不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

    4、String,StringBuffer,StringBuilder区别

    1、三者在执行速度上:StringBuilder > StringBuffer > String (由于String是常量,不可改变,拼接时会重新创建新的对象)。
    2、StringBuffer是线程安全的,StringBuilder是线程不安全的。(由于StringBuffer有缓冲区)

    5、Java中重载和重写的区别:

    1、重载:一个类中可以有多个相同方法名的,但是参数类型和个数都不一样。这是重载。
    2、重写:子类继承父类,则子类可以通过实现父类中的方法,从而新的方法把父类旧的方法覆盖。

    6、Http https区别

    此处延伸:https的实现原理
    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
    https实现原理:
    (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
    (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
    (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
    (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
    (5)Web服务器利用自己的私钥解密出会话密钥。
    (6)Web服务器利用会话密钥加密与客户端之间的通信。

    7、Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议?

    tcp/ip的五层模型:
    从下到上:物理层->数据链路层->网络层->传输层->应用层

    其中tcp/ip位于模型中的网络层,处于同一层的还有ICMP(网络控制信息协议)。http位于模型中的应用层
    由于tcp/ip是面向连接的可靠协议,而http是在传输层基于tcp/ip协议的,所以说http是可靠的数据传输协议。

    8、HTTP链接的特点

    HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。
    从建立连接到关闭连接的过程称为“一次连接”。

    9、TCP和UDP的区别

    tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。
    udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。
    由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。

    10、Socket建立网络连接的步骤

    建立Socket连接至少需要一对套接字,其中一个运行与客户端--ClientSocket,一个运行于服务端--ServiceSocket
    1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
    2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。注意:客户端的套接字必须描述他要连接的服务器的套接字,
    指出服务器套接字的地址和端口号,然后就像服务器端套接字提出连接请求。
    3、连接确认:当服务器端套接字监听到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述
    发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字则继续处于监听状态,继续接收其他客户端套接字的连接请求。

    11、Tcp/IP三次握手,四次挥手

    12、kotlin
    13、Android适配
    https://zhuanlan.zhihu.com/p/154069063

    相关文章

      网友评论

          本文标题:一些知识点的整理

          本文链接:https://www.haomeiwen.com/subject/noqgzhtx.html