HarmonyOS鸿蒙Next Android相关面试题
HarmonyOS鸿蒙Next Android相关面试题
activity的生命周期
七个生命周期+onsaveInstanceState & onRestoreInstanceState(他俩会默认保存一些数据,但是运行时数据不会自动保存,如果向保存数据需要重写onsaveinstancestate方法去记录数据)onsaveinstancestate在onpause之前,onRestoreInstanceState在oncreate之后
Activity-A跳到Activity-B总共经历了那几个生命周期,从activity-B返回到A界面经历了那几个生命周期
Activity的启动方式有哪几种
Git相关命令
对于Hashmap存储你了解多少
为什么hashcode一般要和equals一块重写
一般情况下重写equals方法,因为不重写只会比较地址,新建两个学生,信息、学号、姓名都一致,只有地址不一致,但是如果不重写equals的话,那么比较起来就返回false,所以需要重写equals,但是使用hashmap的时候使用过hashcode方法计算hashmap存入到哪个桶的,所以也要重写hashcode
对象的四种引用
如何保持多线程安全
如何实现多进程与多线程之间的交互
了解泛型吗,为什么要进行泛型擦除
viewmodel是什么,有什么作用,为什么常与livedata一块使用
viewmodel可以存储和管理UI数据,并且有对生命周期的感知,常用于横竖屏切换保存数据,同时避免手动管理数据和UI刷新的繁琐步骤
说一下四大组件
垃圾回收机制
类加载过程
文件输入流是累加还是覆盖
Post请求和Get请求有什么区别
1.get将参数以?追加在末尾,多个参数使用&连接,尔post请求放在请求体中
2.get通常用于获取资源,所以是幂等的,多次获取的结果都是一样的,而且存在缓存,但是post请求一般用于表单提交,不是幂等的,所以一般不存在缓存
缓存机制:添加Expries字段设置缓存时长,Cache-Control -》max-age字段,设置缓存时长
抽象类和接口有什么区别
抽象类:本质是类,只是不可以直接实例化,相比于正常类多了抽象方法,同时不可用final修饰,因为使用抽象类需要继承
接口:用于限制类的行为,可以存在抽象方法和常量,后来引入静态方法和普通方法,为了在类实现接口的过程中有选择的重写接口方法
什么是堆栈溢出,内存溢出,内存泄漏,整数溢出
java面向对象的三大特性
什么是多态
array和link的区别
array首先他是定长的,虽然存在扩容也是将小的array数据转移到大的array中,并且存储的位置需要有连续的代码块
link是变长的,存储数据的位置可以试不连续的位置,通过link的节点指向下个节点
equals和==的区别
equals没重写之前是比较的是对象的地址,重写后比较的是值
==,如果是基础类型比较的是值,如果是复杂类型比较的是地址
wait和sleep区别
sleep:Thread的方法,线程睡着了,持有资源不释放,睡眠时间过了会自动醒
wait:一般和notify一块使用,等待,等待中释放资源,需要其他线程进行唤醒才可以重新获取资源,继续执行
ThreadLocal是啥,有什么作用
线程的个人空间,保证线程之间的数据相互独立,使用后需要remove,避免内存泄漏,在那个线程初始化就绑定对应线程,set get获取存储资源
讲一下android发生crash的整理流程
以空指针进行举例:
如果在未知情况下触发空指针异常,对应会生成一个空指针类,如果当前方法中没有捕获该异常,异常会向上逐层传递,寻找是否有捕获,如果都未捕获则传递给jvm虚拟机处理,打印日志或者停止程序等
单例模式的几种创建方式
1.懒汉式:声明实例对象但未初始化,私有构造方法,getinstance(如果为空则初始化,如果不为空则直接返回)
2.饿汉式:初始化常量实例对象,私有构造方法,getinstance返回对象实例
3.静态内部类:内部类中初始化常量实例对象,私有构造方法,getinstance(返回该对象):::::::静态内部类即用即加载
4.双向绑定:声明实例对象但未初始化使用volatile修饰,两层if判断生命对象是否为null,外层if是提高效率,内部if避免出错,volatile避免指令重拍
单例模式中双向绑定为什么要用volatile修饰
首先volatile修饰的变量使其变为可见,进而防止指令重排,一个对象的声明过程虽然只需要new一下,但是实际要分为三部,1.分配地址 2.执行构造方法 3.返回对象引用,但是为了提高效率引入了指令重排,可能返回引用优先于分配地址之前执行,但是在双双向绑定过程中如果先返回了引用,那么多线程就可能导致问题,所以使用volatile防止指令重排
Linux命令
看jdk版本:java–version
看python版本:python–verson python3–version
看svn版本:svn–version(apt-get install subversion)
怎么看repo下载好没:which repo
用户配置文件:加载source~/.bashrc 全局配置文件etc/profile
失误删除了.gradle之后之后运行代码空指针:
rm -rf -/.gradle/wrapper/dists
./gradlew
设置别名:allas ll=‘ls -lt’
脚本:
echo off :关闭回显功能,只显示结果不显示命令行
pause:请按任意键返回
new对象的过程
先是分配内存 初始化默认值同时执行构造方法 返回引用
如何动态禁用组建,禁用service,broadcast
1.获取PackageManager:PackageManager=getApplicationContext().getPackageManager();
2.packageManager.setComponentEnabledSetting(组件名称,是否禁用,标志(0是没有标志按照manifest文件 1是启用 2是禁用))
3.也可以在manifest文件中设置enable未false/true
动态代理(解耦、增强功能,代码复用)
为什么startactivity中一般使用class不用java
class文件是编译后的产物,所以可以在编译过程中检查类是否存在,减少运行时发生错误的概率
Android Studio的常用设置
1.工程编译失败,可以查看父类,工程右键-make Diretory as - sourceRoot -(以java形式扫描)
Viewpaper2如何使用
主动等待和被动阻塞有什么区别
主动等待是线程调用了wait方法,进入等待状态,同时释放资源,等待其他线程调用notify方法进行唤醒
被动阻塞是多线程获取资源不一致,没获取到资源被动等待,同时也会释放本身持有的资源避免死锁
启动一个程序,从主界面点击图标进入和从一个app跳进去,这两种方式有什么不同
1.主界面点击图标进入可以使用该程序的所有功能
2.从其他app进入只能使用该app的部分功能
RecyclerView了解不
android操作系统的层级划分
应用层:系统应用+第三方应用。包括非安卓系统提供的第三方库
应用程序框架层:就是安卓应用引入的各种api
系统运行底层:封装了C/C++语言编写的Android所需要的核心功能,比如sqlite数据库访问
android运行环境层:用于执行android代码
Linux内核层:封装了硬件管理和驱动、内存等
请列举常见的安卓性能优化
1.合理的使用对象引用
2.复杂的UI界面使用约束布局
3.不在主线程进行耗时操作
4.在高并发的环境下尽量使用合适的线程池
5.对于经常使用的资源使用缓存存储
6.即使回收不适用的资源,避免资源浪费
LruCache缓存相关知识
栈空间一般存储的是什么数据
局部变量存在栈空间,对象的引用存在栈空间,对象本身存在堆空间
解释一下套接字的工作流程
fragment的生命周期
onAttach
onCreate
onCreateView
onViewCreated
onStart
onResume
onPause
onStop
onDestoryView
onDestory
onDetch
fragment之间的通讯方式
1.共享ViewModel(写一个继承viewmodel,在fragment中通过new viewmodelProvider(requireActivity()).get(ShareViewModel.class)获取viewmodel,
即可在两个fragment中获取一个实例–好像使用单例模式返回其中一个对象也中
2.通过bundle,fragment.setArguments 一个存一个取
fragment怎么和父activity传递消息
fragment的使用方式
getSupportFragmentManager().beginTransaction()
1.add()
2.replace()
3.remove()
4.addToBackTask()添加至回退栈
5.popBackTask()弹出回退栈
注意:一次事务一次commit,提交好不可以再次commit,需要重新创建事务
fragment的回退栈是什么,如何管理fragment的回退栈?
通过add方法是可以加上.addToBackTask(null),是将此次任务添加至回退栈,如果点击回退按钮是可以退回到上个fragment的,null是标记,可以采用一个字符,字符在回退栈中代表某个fragment,弹出回退栈的时候可以回退到某个特定的fragment—fragmentManager.popBackTask(‘特定字符’,指定参数)
activity下存在多个fragment怎么使用
使用ViewPaper和适配器:
1.FragmentStatePagerAdapter:适用于数量达,会保存其状态
2.FragmentPagerAdapter:适用于数量小,不会保存其状态
fragment怎么实现懒加载
懒加载分为两种:
1.使用viewpager,以fragment为单位,懒加载其左右两个fragment
2.重写setUserVisibleHint,在页面可见时加载数据,实现懒加载
fragment的嵌套使用
和正常使用一样,只是获取事务类时是getChildFragmentManager
fragment中的add和replace区别
1.add是新增一个到fragmentManager容器中,覆盖住上面的fragment
2.replace是替换上一次的fragment,如果原来有三个fragment在容器中,使用replace加入一个还是三个
注意:和回退栈没有关系
自定义组件常用方式
1.首先可以自定义属性,放在value文件夹,然后再布局文件中使用app:引用自定义属性,如果在定义属性的时候使用android为前缀,在使用的时候可以直接用android:text类似
2.在构造方法中动态声明属性,设置默认值,如果布局文件中设置了会优先使用布局文件设置的值,如果没设置就是用默认值
3.使用onMesure方法,设置组件大小,指定宽度和高度,传递两个参数,包含父布局对该view的测量要求和默认大小
4.onLayout将布局放在容器的什么位置
5.使用onDraw方法画图,你要什么样式就画什么样式
6.添加事件onTouchEvent
什么是可见性和原子性
1.可见性:当一个值改变之后,其他线程立刻就能感知到这个新的值,多线程情况下,每个线程有自己的空间存储数据,如果一个变量被volitile修饰之后,这个属性会从私有空间变成公共区域中
2.原子性:一个操作要么全部成功,要么全部失败
包装类的使用,为什么要使用包装类
1.参与泛型,可以用于泛型的类型设定
2.还有一点时包装类可以为null,而基础类型只能为默认值
interger修饰的50==50是true还是false 那么150==150呢
integer型数据会维护一个常量池,如果-128-127之间的数据会直接复用,所以地址是一样的,50==50,而150!=150
匿名内部类访问外部类为什么要使用final修饰
为了避免内部类修改值影戏外部类同时也避免了外部类修改值导致与内部类的值不一致
如何保存activity状态
保存状态:onSaveInstanceState
回复状态:onRestoreInstanceState
说下activity和phonewindow和view的关系
Activity-》phoneWindow - 》DecorView
事件的传递机制
Activity-》phoneWindow - 》DecorView-布局文件顶层布局
1.事件分发:最先接收到事件,true就是传递给ouTouchEvent执行
2.事件拦截:被事件分发调用,如果为false就是想子view发送,这是事件分发还没有拿到数据,所以不存在事件分发是true,时间拦截是false
3.事件消费:如果事件从头到尾都没有组件消费事件,就会向上传递
eg:如果事件最终没人消费,那么最终这个事件就会被忽视或者执行默认操作
怎么解决事件触发矛盾
例如:外层横向viewpaper内部listview,怎么解决点击矛盾
事件发生:按下 滑动 离开
方法一:父布局拦截法,首先按下一定不要拦截,因为事件分发机制,拦下来就只能给他了,只有滑动却符合拦截事件去拦截(拦截条件:记录按下坐标,滑动更新坐标,滑动时更新坐标,拿到对应的差值,Y/X == 1 大于1上下滑动,小于1左右滑动
一个handler可以有几个looper,一个looper可以有几个handler
一个hande对应一个looper,一个Looper可以对应多个handle
什么是隐式intent、什么是显式yintent
1.行为动作是隐式,使用action行为匹配对应的activity叫隐式启动activty
2.目的明确的是显式,使用activity.class去启动
api升级34
1.隐式启动,启动广播必须加上package
2.注册广播的同时也必须加上可以不可以被其他app发现,对应属性:exported 34新增的Context.RECEIVER_EXPROTED
pendingIntent是什么
不可以使用intent代替,该pendingIntent作用就是外部应用再某一时刻代替你做一些事情
四大组件之间是怎么通讯的
说说gc机制
一个程序每个两分钟执行一次,怎么实现
设计模式你知道多少,说下建造者模式
1.工厂模式
2.单例模式
3.观察者模式
什么是OOM,如何避免OOM
mvc—mvp
什么是控制反转
如何防止https攻击
一般采用证书,如果是okhttp的话,他会自动的校验证书是否正确,如果是httpurlconnection的话,需要手动设置证书-sslContext
如何进行一个http请求
http请求头中有哪些常用属性,响应头中有哪些常用属性
tcp协议的三次握手与四次挥手
http和tcp有什么区别
http:使用起来,一个请求一个响应,一问一答,没有建立连接,响应后就结束–应用层
tcp:建立可靠连接,像是打电话说话一样—传输层
OKHttp的超时时间,有考虑DNS超时码
OKHttp线程池,连接池讲一下
OKHttp的所有拦截器有哪些,请求失败了重试1,2次怎么做
能说下关于RecyclerView的LayoutManager相关的吗
intent能携带多大的数据,几MB
Anr是安卓主线程一种超时保护机制。一般有几种情况
1.主线程执行了耗时操作
2.死锁完成逻辑阻塞
Glide缓存特点
Glide为什么做了那些内存优化
内存泄漏问题: 在 Android 应用中,如果没有正确管理图片的加载和缓存,容易导致内存泄漏,从而影响应用的性能和稳定性。Glide 实现了有效的内存管理机制,包括使用软引用和弱引用来持有图片缓存,以及在适当的时候释放缓存,防止因为缓存过多而导致内存溢出或频繁的系统垃圾回收。
缓存策略: Glide 通过灵活的缓存策略来平衡图片加载速度和内存消耗。它能够根据图片尺寸、清晰度和显示情况等因素动态调整缓存策略,以提高性能和用户体验。
资源重用: 在列表等频繁更新的场景中,Glide 通过资源重用技术,有效地管理和复用已加载的图片资源。这样可以减少内存占用,提升列表滑动的流畅性。
生命周期绑定: Glide 支持与 Activity 和 Fragment 生命周期绑定,能够在它们的生命周期方法中自动停止图片加载和释放相关资源,避免在界面不可见时继续消耗资源。
Bitmap 缩减: Glide 在加载大图时,会自动进行采样和缩减操作,以减少内存占用。它能够根据显示控件的尺寸和屏幕密度来动态地调整图片的加载尺寸,避免加载过大的 Bitmap 数据。
灵活的配置选项: Glide 提供了丰富的配置选项,允许开发者根据具体需求调整图片加载的行为和内存使用策略,从而在不同场景下实现最佳的性能表现。
Glide如何加载GIF,加载Gif图片用什么办法
1.Glide
2.picasso
3.movie
java中的反射你了解多少
反射就是通过class文件获取该类的对象,一般用于运行时确定对象
eg:用户可以输入圆,长方形,正方形,你要对应生成其实例对象就可以使用反射
如何确保app在不同分辨率上正常显示
1.使用dp为单位
2.针对图片尽量采用矢量图可以无限扩大,当然存在多个不同分辨率的png也可以的,存放在不同的资源文件夹下,系统会根据分辨率自动获取
3.尽量采用约束布局,避免使用绝对布局和在逻辑代码中强制设置长宽
FixedThreadPool(固定大小线程池)
CachedThreadPool(缓存线程池)
SingleThreadExecutor 单线程线程池
ScheduledThreadPool(定时任务线程池)
WorkStealingPool(工作窃取线程池)
Jetpack的常用组件
1.Lifecycle:在组件的生命周期中添加观察者,Lifecycle.event.on_create
2.viewmodel:存储数据用的,为了防止重复加载数据
3.liveData:对数据绑定观察者,当数据发生改变做出一系列动作,比如修改UI等
4.workManager:执行任务使用,相比于IntentService有更好的任务调度
5.Navigation:路由,页面跳转的时候使用(暂时不会)
6.Room:数据库的第三方库(暂时不会)
7.paging
8.DataBinding
9.security
动画从左上角滑动到右下之后点击可以实现吗
更多关于HarmonyOS鸿蒙Next Android相关面试题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next与Android无直接关联,是独立操作系统。面试可能涉及以下核心点:
- 架构差异:鸿蒙采用分布式设计,无Android虚拟机,直接使用ArkTS/JS开发框架
- 核心技术:
- 原子化服务
- 分布式软总线
- 确定性延迟引擎
- 开发栈:
- 声明式UI开发范式
- Stage模型应用架构
- 仅支持HAP格式安装包
- 兼容性:Next版本不再支持APK运行
需注意鸿蒙应用生态与Android完全隔离,开发工具链使用DevEco Studio。
更多关于HarmonyOS鸿蒙Next Android相关面试题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个非常全面的Android面试题集合,涵盖了从基础到进阶的多个方面。针对HarmonyOS Next开发者,虽然部分Android知识可以直接迁移,但需要注意HarmonyOS的差异点:
- Activity生命周期在HarmonyOS中对应的是Ability的生命周期,有类似但不同的回调方法
- ViewModel/LiveData在HarmonyOS中有对应的@Observed/@Watch观察机制
- Fragment在HarmonyOS中使用AbilitySlice实现类似功能
- 事件分发机制在HarmonyOS中通过手势识别和组件事件处理实现
- 线程模型方面,HarmonyOS使用TaskDispatcher进行任务调度
建议准备HarmonyOS面试时:
- 重点掌握ArkUI开发范式
- 熟悉分布式能力
- 了解Ability和AbilitySlice的生命周期
- 掌握HarmonyOS特有的线程模型和IPC机制
这些Android基础知识仍然有价值,但需要结合HarmonyOS的特性进行转换理解。