IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android面试题整合(待完善) -> 正文阅读

[移动开发]Android面试题整合(待完善)

一.Activity生命周期

onCreate->onStart->onResume->onPause->onStop(onRestart )->onDestroy
打开AAct再调到BAct 生命周期过程
依次走A的onCreate,onStart,onResume(打开A的生命周期),onPause(调到B)
B的onCreate,onStart,onResume
然后A的onStop

?


二.Activity启动模式

1.standard,每打开一个,任务栈里面就有一个(把任务栈看成一个弹夹,Activity看成子弹,在最上面的子弹肯定最先打出去)

2.singleTop,如果在栈顶,就不会新建,走onNewIntent()方法;不在栈顶(栈里有没有都一样)跟standard一样的

3.singleTask,如果在栈顶,跟singleTop一样。不在栈顶:任务栈里面有,把这个Act压到栈顶,并且把在它之上的全部finish掉;任务栈没有,就是往栈里压一个

4.singleInstance,应用层开发很少用到,会在单独的任务栈中压入,并且这个栈只有它自己
参考资料:https://blog.csdn.net/qq_30878303/article/details/101217842
?? ?

三.Android常用布局及优缺点

RelativeLayout
????????优点:灵活性高--控件可以任意摆放位置、可以立体重叠摆放--->适合作为最外层布局
????????缺点:需要不断地设置参考系,使用较为繁琐,操作不当会造成控件之间相互影响
LinearLayout
????????优点:自动在一个方向上进行布局,通过距离或权重控制控件的放置--->操作简单,容易上手
????????缺点:死板,只能在某一方向上排布且不能换行
GridLayout
????????优点:可以设置行列,自动换行--->适用于排列比较整齐的网格化布局,比如计算器等
????????缺点:样式比较呆板,适用范围较小
FrameLayout
????????优点:方式简单,常被系统作为默认布局,功耗较低
????????缺点:广泛适用性不强
ConstraintLayout:??

????????最灵活最全面的一个布局,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件,一些复杂的UI,可能会出现布局嵌套过多的问题,嵌套得越多,设备绘制视图所需的时间和计算功耗也就越多????
参考资料:
https://blog.csdn.net/yxb_yingu/article/details/51500963
https://blog.csdn.net/zjxwon/article/details/106841571
https://www.jianshu.com/p/17ec9bd6ca8a
?? ?

四.Activity Window View 三者的关系

依次包含的关系
????????1.在Activity中调用attach,创建了一个Window(其子类PhoneWindow)
????????2.在Activity中调用setContentView(R.layout.xxx)(实际是getWindow().setContentView()也就是PhoneWindow中的setContentView方法)
????????3.PhoneWindow中的setContentView方法会创建ParentView:
作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)
????????4.将指定的R.layout.xxx进行填充
通过布局填充器进行填充【其中的parent指的就是DecorView】
????????5.调用到ViewGroup
????????6.调用ViewGroup的removeAllView(),先将所有的view移除掉
????????7.添加新的view:addView()
参考资料:https://blog.csdn.net/zjxwon/article/details/106841571

五.Application中的Context和Activity中的Context的区别


????????1.返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例;
????????2.生命周期不同,getApplicationContext() 生命周期是整个应用,当应用程序摧毁的时候,它才会摧毁;Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它就摧毁
参考资料:https://blog.csdn.net/zx_android/article/details/79483748

六.Handler机制

Looper,MessageQueue,Handler三者相互协调的过程,
主线程-->prepareMainLooper()(内部调用prepare() ,去实例化Looper,Looper实例化同时创建了messagequeue,11对应关系)-->主线程中的handler获取当前线程的Looper-->三者关联
子线程-->直接通过Looper.prepare()去实例化Looper,Looper实例化同时创建了messagequeue(11对应关系) -->实例化Handler同时获取当前子线程的Looper-->三者关联?? ?Loop()方法,循环取出messagequeue消息队列中的消息,并分发出去。再把分发后的Message回收到消息池,以便重复利用
?? ?总结
1.Handler通过sendMessage()方法发送Message到MessageQueue队列?

2.当前Thread中Looper通过调用loop(),不断取出达到触发条件的Message,通过对应target(Handler)的dispatchMessage()方法,将Message交给Handler的handleMessage()方法来处理。?? 3.一个线程对应一个Looper,一个Looper对应一个MessageQueue,一个MessageQueue可以对用多个Message。但是一个Message只能让一个handler来处理(就是Message中target所指定的handler)
分发消息:Message的回调方法>Handler的回调方法>Handler的默认方法
参考资料:https://blog.csdn.net/qq_37321098/article/details/81535449
?? ?Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?为什么?
?? ?1.postDelay()一个10秒钟的Runnable A、消息进队,MessageQueue调用nativePollOnce()阻塞,Looper阻塞;
?? ?2.紧接着post()一个Runnable B、消息进队,判断现在A时间还没到、正在阻塞,把B插入消息队列的头部(A的前面),然后调用nativeWake()方法唤醒线程;
?? ?3.MessageQueue.next()方法被唤醒后,重新开始读取消息链表,第一个消息B无延时,直接返回给Looper;?? ?

? ? 4.Looper处理完这个消息再次调用next()方法,MessageQueue继续读取消息链表,第二个消息A还没到时间,计算一下剩余时间(假如还剩9秒)继续调用nativePollOnce()阻塞;
?? ?5.直到阻塞时间到或者下一次有Message进队;?? ?这样,基本上就能保证Handler.postDelayed()发布的消息能在相对精确的时间被传递给Looper进行处理而又不会阻塞队列了?? ?MessageQueue会根据postDelay的时间排序放入到链表中,链表头的时间小,尾部时间最大。因此能保证时间Delay最长的不会block住时间短的。当每次post message的时候会进入到MessageQueue的next()方法,会根据其delay时间和链表头的比较,如果更短则,放入链表头,并且看时间是否有delay,如果有,则block,等待时间到来唤醒执行,否则将唤醒立即执行。?? ?所以handler.postDelay并不是先等待一定的时间再放入到MessageQueue中,而是直接进入MessageQueue,以MessageQueue的时间顺序排列和唤醒的方式结合实现的。使用后者的方式,我认为是集中式的统一管理了所有message,而如果像前者的话,有多少个delayMessage,则需要起多少个定时器。前者由于有了排序,而且保存的每个message的执行时间,因此只需一个定时器按顺序next即可
参考资料:https://www.cnblogs.com/ldq2016/p/9260783.html? ??

?? ?
七.JVM虚拟机基础知识

Java虚拟器运行时数据区:


1.所有线程共享的数据区(执行引擎):
方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

:对于绝大多数应用来说,这块区域是JVM所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续
2.贤臣隔离的数据区(本地库接口):
虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程
本地方法栈:区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常

程序计数器:内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成
参考资料:https://blog.csdn.net/qq_41701956/article/details/81664921?

八.Java设计模式

????????创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
   结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
   行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
?? ?1.单例模式?? ?保证一个类仅有一个实例,并提供一个访问它的全局访问点,当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
?? ?2.工厂模式

?? ?定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类(当一个类不知道它所必须创建的对象的类的时候)
?? ?3.构造者模式?? ?将一个复杂对象(需要的属性超过五个)的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
? 代码示例

?class Person{
? ? private String name;
? ? private String address;
? ? private int age;
? ? private int sex;
? ? private int height;
? ? private int weight;
? ? public void setName(String name) {this.name = name;}
? ? public String getName() {return name;}
? ? public void setAddress(String address) {this.address = address;}
? ? public String getAddress() {return address;}
? ? public void setAge(int age) {this.age = age;}
? ? public int getAge() {return age;}
? ? public void setSex(int sex) {this.sex = sex;}
? ? public int getSex() {return sex;}
? ? public void setHeight(int height) {this.height = height;}
? ? public int getHeight() {return height;}
? ? public void setWeight(int weight) {this.weight = weight;}
? ? public int getWeight() {return weight;}
}
class PersonBuilder{
? ? private Person person;
? ? public PersonBuilder(){
? ? ? ? this.person = new Person();
? ? }
? ? public PersonBuilder name(String name){
? ? ? ? this.person.setName(name);
? ? ? ? return this;
? ? }
? ? public PersonBuilder address(String address){
? ? ? ? this.person.setAddress(address);
? ? ? ? return this;
? ? }
? ? public PersonBuilder age(int age){
? ? ? ? this.person.setAge(age);
? ? ? ? return this;
? ? }
? ? public PersonBuilder sex(int sex){
? ? ? ? this.person.setSex(sex);
? ? ? ? return this;
? ? }
? ? public PersonBuilder height(int height){
? ? ? ? this.person.setHeight(height);
? ? ? ? return this;
? ? }
? ? public PersonBuilder weight(int weight){
? ? ? ? this.person.setWeight(weight);
? ? ? ? return this;
? ? }
}
public class TestBuilder {
? ? public test(){
? ? ? ? PersonBuilder builder = new PersonBuilder();
? ? ? ? Person person = builder.name("lion")
? ? ? ? ? ? ? ? .address("america")
? ? ? ? ? ? ? ? .age(18)
? ? ? ? ? ? ? ? .sex(2)
? ? ? ? ? ? ? ? .height(180)
? ? ? ? ? ? ? ? .weight(150);
? ? }
}


参考资料:https://www.cnblogs.com/shuigu/p/6908520.html

九.如何把 Activity 对象放进 list 集合里去

由于泛型擦除,在运行时添加 Activity 对象

十.runOnUiThread 、Handler.post、View.post 有什么区别?


runOnUiThread如果在主线程会直接执行;
Handler.post将Runnable放到消息队列中去;
View.post API24及之后版本需要View加到界面上,然后将Runnable放到消息队列中才会执行。

十一.Android 上为啥会有65536的限制,解释下原因


invoke-kind (调用各类方法)指令中,方法引用索引数是 16 位的,也就是最多调用 2^16 = 65536 个方法
Android 是怎么解决65536的问题的?MultiDex在编译时做了什么?
需要在 gradle 中将 multiDexEnable 设为 true,将 application 继承 MultiDexApplication 或者在自己 application#attachBaseContext 调用 MultiDex.install。
1、执行完 MultiDexTransform 后会生成了一个在 mainDex 中出现的 classes 列表
2、执行 DexTransform 是将 mainDex 和其他 dex 的生成落实

待完善的


MultiDex在运行时做了什么?
如何找出项目中存在的内存泄漏问题?(Leakcannary)
如何将已经上线的 App 某个 UI 界面实时刷新的帧率数据统计出来并上报?
Art 、Davilk 虚拟机的区别
如何统计 App 的启动时间?
Android 为什么引入 Parcelable?
使用 Handler.postDelay 做定时操作是否准确?
AndroidManifest 的作用与理解
BBinder 和 BPBinder 的具体含义和区别?
在多进程中,Application 会启动几次?
Gradle 中 buildToolsVersion 和 TargetSdkVersion 的区别是什么?
Android 是如何进行资源管理的?
Android中进程的级别,以及各自的区别

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:59:21  更:2021-11-15 16:01:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:47:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码