Android面试题汇总(三)

news2024/11/17 0:37:58

Android 四大组件相关

1、Activity与Fragment之间常见的通讯方式

对于Activity与Fragment直接的相互调用:

1、Activity调用Fragment直接调用就好了,Activity一般是持有Fragment实例的。或者通过Fragment的id或者tag获取Fragment的实例

2、Fragment调用Activity,使用回调或者getActivty()获取activity的实例

数据传递:

1、Activity传递给fragment,使用bundle添加然后setArgument传递。

2、广播

3、handler

4、EventBus

5、ViewModel实现数据共享

2、谈谈Activity中几种LaunchMode的特点和应用场景

Standard:默认的启动模式,页面创建的时候一直压栈

SingleTop:栈顶跳转模式,跳转页面的时候判断如果栈顶有这个页面,则这个页面上的所有页面进行出栈。如果栈顶没有这个页面则重新创建。

SingleTask:站内跳转模式,主要应用于首页。跳转页面的时候判断站内有这个页面则这个页面上的所有页面出栈。如果栈内没有则重新创建。

SingleInstance:独立站模式,把页面设置成这个模式会变成一个独立的进程。假设ABC三个页面B页面是这个模式,A->B->C跳转,返回的时候则是C->A

3、BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别?

BroadcaseRecevier:是跨应用广播,使用Binder来实现,支持动态和静态注册

LocalBroadcaseRecevier:应用内广播,Handler来实现的,应用内效率高更安全,仅支持动态注册

4、Context了解多少

0、Context是一个抽象类,在安卓中代表我们的上下文

1、Content主要是获取系统信息,访问资源,信息存储,AMS的交互

2、ContentImpl是具体的实现类,Activity,Service,Application本质就是Context都包含这个ContentImpl类,委托他获取资源

3、Context的数量:Activity+Service+Application(1)

4、ContentWrapper是Context的包装类,其实也是委托ContextImpl来实现的

5、ContextImpl是上下文的核心空间,可以实现安卓平台的通信,比如startActivity

5、IntentFilter 是什么?有哪些使用场景?匹配机制是怎样的?

IntentFilter是Intent隐式跳转的配置,分为3种匹配规则:action\category\data

action:intent-filter可以多个,Intent只能一个。如果Intent-filter不配置action,Intent无法通过。如果配置了action,那么Intent不配置action可以通过,如果Intent配置了action则必须是IntentFilter其中的一个,区分大小写

category:2者都可以多个,如果IntentFilter不配置则所有的Intent无法通过,因为有默认的。IntentFilter配置category,Intent不配置可以通过,如果配置则必须是IntentFilter配置的子集。

data:IntentFilter可以配置多个,Intent只能一个。如果通过2者必须精准匹配一模一样

匹配机制:IntentFilter必须满足其中一组的action、category、data全部通过。同一个应用尽量使用显示意图跳转

6、谈一谈 startService 和 bindService 方法的区别,生命周期以及使用场景?

1、执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。 ​

2、执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。这里所谓的绑定在一起就是说两者共存亡了。 ​

3、多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。Service的onStart方法在API 5时被废弃,替代它的是onStartCommand方法。

4、第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。

7、调用者如何获取绑定后的Service的方法

onBind回调方法将返回给客户端一个IBinder接口实例,IBinder允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。我们需要IBinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象。

8、既使用startService又使用bindService的情况

如果一个Service又被启动又被绑定,则该Service会一直在后台运行。首先不管如何调用,onCreate始终只会调用一次。对应startService调用多少次,Service的onStartCommand方法便会调用多少次。Service的终止,需要unbindService和stopService同时调用才行。不管startService与bindService的调用顺序,如果先调用unbindService,此时服务不会自动终止,再调用stopService之后,服务才会终止;如果先调用stopService,此时服务也不会终止,而再调用unbindService或者之前调用bindService的Context不存在了(如Activity被finish的时候)之后,服务才会自动停止。 ​

那么,什么情况下既使用startService,又使用bindService呢? ​

1、如果你只是想要启动一个后台服务长期进行某项任务,那么使用startService便可以了。如果你还想要与正在运行的Service取得联系,那么有两种方法:一种是使用broadcast,另一种是使用bindService。前者的缺点是如果交流较为频繁,容易造成性能上的问题,而后者则没有这些问题。因此,这种情况就需要startService和bindService一起使用了。 ​

2、另外,如果你的服务只是公开一个远程接口,供连接上的客户端(Android的Service是C/S架构)远程调用执行方法,这个时候你可以不让服务一开始就运行,而只是bindService,这样在第一次bindService的时候才会创建服务的实例运行它,这会节约很多系统资源,特别是如果你的服务是远程服务,那么效果会越明显(当然在Servcie创建的是偶会花去一定时间,这点需要注意)。  

9、本地服务与远程服务

本地服务依附在主进程上,在一定程度上节约了资源。本地服务因为是在同一进程,因此不需要IPC,也不需要AIDL。相应bindService会方便很多。缺点是主进程被kill后,服务变会终止。 ​

远程服务是独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被kill的是偶,该服务依然在运行。缺点是该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。

对于startService来说,不管是本地服务还是远程服务,我们需要做的工作都一样简单。

10、Service 如何进行保活?

1、和系统厂商合作加入白名单

2、息屏的时候启动1px像素的activity,Service中循环播放静音的音频提高优先级

3、谷歌推荐的是前台服务的保活,但是会有通知栏

4、全家桶,相互发系统广播做服务的拉起

11、简单介绍下 ContentProvider 是如何实现数据共享的?

当程序A想把数据共享给程序B的时候,用到ContentProvider实现数据共享,程序B不管程序A是否启动使用ContentResolver实现数据的增删改查

ContentProvider以URI提供数据,ContentResolver也是以URI实现数据访问

12、说下切换横竖屏时 Activity 的生命周期变化?

竖屏: 启动:onCreat->onStart->onResume. 切换横屏时: onPause-> onSaveInstanceState ->onStop->onDestory

onCreat->onStart->onSaveInstanceState->onResume.

但是,我们在如果配置这个属性:android:configChanges="orientation|keyboardHidden|screenSize" 就不会在调用Activity的生命周期,只会调用onConfigurationChanged方法

13、Activity 中 onNewIntent 方法的调用时机和使用场景?

当Activity设置为SingleTask或者SingleTop的时候,页面再次被跳转的时候,不会重新创建。此时在onNewIntent方法中获取传参

14、Intent 传输数据的大小有限制吗?如何解决?

Intent基于Binder,Intent数据会存储在Bundle中,小于1M

可以用本地数据存储,或者eventbus等方式

15、说说 ContentProvider、ContentResolver、ContentObserver 之间的关系?

ContentResolver实现ContengProviver共享来的数据,同时注册ContentObserver实现数据的监听

Android 异步任务和消息机制

1、HandlerThread 的使用场景和实现原理?

HandlerThread是Handler的一个封装体,线程有了自己的Loop这样就可以进行一个绑定。在我们不需要读取消息队列的时候就对线程进行quit就可以了

2、IntentService 的应用场景和内部实现原理?

IntentServiceService 的子类,默认为我们开启了一个工作线程,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务,使用简单,只要实现一个方法 onHandleIntent,该方法会接收每个启动请求的 Intent,能够执行后台工作和耗时操作。可以启动 IntentService 多次,而每一个耗时操作会以队列的方式在 IntentService 的 onHandlerIntent 回调方法中执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个。并且等待所有消息都执行完后才终止服务。

IntentService 适用于 APP 在不影响当前用户的操作的前提下,在后台默默的做一些操作。

IntentService源码:

  1. 通过 HandlerThread 单独开启一个名为 IntentService 的线程
  2. 创建一个名叫 ServiceHandler 的内部 Handler
  3. 把内部Handler与HandlerThread所对应的子线程进行绑定
  4. 通过 onStartCommand() 传递给服务 intent,依次插入到工作队列中,并逐个发送给 onHandleIntent()
  5. 通过 onHandleIntent() 来依次处理所有 Intent 请求对象所对应的任务

3、谈谈你对 Activity.runOnUiThread 的理解?

是重新创建了一个Runnable对象,使其绑定到主线程。在runOnUiThread方法中,判断如果在主线程了只能run。如果不在则handler会将runnable post到looper中,而handler则是绑定主线程的Looper,就会在主线程中执行代码

4、Android 的子线程能否做到更新 UI?

极端情况下可以在页面加载之前进行绘制,onCreate,onStart,onResums. 因为此时的主线程还没有进行UI的绘制

5、谈谈 Android 中消息机制和原理?

在主线程中创建Handler对象,重新handleMessage()方法. 在子线程中创建Message对象,并使用Handler对象将其发送到MessageQueue中,Looper会一直尝试抓起队列中的消息,然后将其发送给Handler的handleMessage方法

6、为什么在子线程中创建 Handler 会抛异常?

因为在主线程中创建Handler会自动绑定主线程中的Looper,但是子线程中没有开启Looper也没有进行Looper绑定,所以会报错

1、可以在子线程中Looper.loop() 去开启,这样runnable运行在子线程,但是runable中不可以更新UI只能做联网操作

2、可以子线程中的handler去绑定主线程的Looper,这样runnable运行在主线程,这样可以更新UI但是不能联网

Android UI 绘制相关-

此类主要涵盖 Android 的 View 绘制过程、常见 UI 组件、自定义 View、动画等。

1、Android 补间动画和属性动画的区别?

补间动画:平移、旋转、透明度和缩放。只能作用在view上,不会改变view的属性,,复杂的动画能力差,使用范围也一般

属性动画:完全包含了补间动画,平移旋转缩放透明度能实现外,还可以组合,抛物线等等,他可以作用任何对象上,会改变对象的属性值,复杂的动画能力强,使用范围大

2、Window和DecorView是什么,他们怎么建立联系

window:是windowManager管理的最顶级的view,他负责的是窗口(背景)。他是个抽象类,实现类是phoneWindow. 

DecorView:是view的根节点,里面是一个竖向的LinearLayout  分为上下2个部分,上面是titleBar,下面是contentParent.  实现Activity就是在contentParent中。所有的view事件都是要经过DecorView然后在给到View中。

联系:DecorView是window的一个属性,所以是被widow持有的。view是通过DecorView加载的,DecorView是被window持有渲染显示的。

3、你认为 LinearLayout、FrameLayout 和 RelativeLayout 哪个效率高, 为什么?

绘制效率:FrameLayout>LinearLayout>RelativeLayout.  因为FrameLayout只需要一层层的放上去就好了。LinearLayout是2个方向的。RelativeLayout是根据id计算的

工作效率:每个使用场景不同,不同场景使用不用的布局方式,不存在工作效率比较

4、说一下 Android 中的事件分发机制?

1、触发过程:Activity->Window->DocerView->ViewGroup->View,View不触发再返回由父级处理依次向上推。 2.在每个阶段都要经过三个方法 dispatchTouchEvent(分发)、onInterceptTouchEvent(拦截)、onTouch(处理)

大体流程: Activity中走了Window 的 dispatch,Window 的 dispatch 方法直接走了 DocerView 的 dispatch 方法,DocerView 又直接分发给了 ViewGroup,ViewGroup 中走的是 onInterce 判断是否拦截,拦截的话会走 onTouch 来处理,不拦截则继续下发给 View。到 View 这里已经是最底层了,View 若继续不处理,那就调用上层的 onTouch 处理,上层不处理继续往上推。

5、谈一谈获取View宽高的几种方法?

1、onGlobalLayoutListener

2、onPerDrawLauyoutListener

3、onLayoutChangeListener

4、view.post

5、重写view中onSizeChange()方法

6、谈一谈属性动画的插值器和估值器?

插值器:根据时间流逝的百分比来计算属性变化的百分比,系统有加速的、减速的或者加减速的

估值器:就是属性百分比的具体值。系统有整数的、浮点数或者是颜色估值器。

7、关于LayoutInflater,它是如何通过 inflate 方法获取到具体View的?

通过XML解析器获取标签的名字,然后去走createview去根据类的全路径,再然后去进行反射创建出类。

8、谈一谈如何实现 Fragment 懒加载?

正常的Fragment默认都会有一个预加载的页面,其实就是同时加载了2个。解决这个问题2种方法

1、在setVisbleHint()方法中判断是否是第一次加载或者页面的可见状态

2、androidX后第一个方法就没有用了, setMaxLifeCycler(START) 这个方法可以设置fragment显示到onStart().我们不显示的frgament不去加载数据,只有显示的fragment在onResume种网络请求

9、请谈谈 invalidate() 和 postInvalidate() 方法的区别和应用场景?

invalidate():绘制UI的方法,在UI线程中调用

postinvalidate():绘制UI的方法,可以在UI线程或者子线程中调用,因为他内部使用的是Handler所以会帮我们切换线程,实际上还是在主线程中更新的UI

10、谈一谈 SurfaceView 与 TextureView 的使用场景和用法?

SurfaceView:是可以在子线程刷新的view,不同于其他view没有动画view的特性也没有

TextrueView:是SurfaceView的升级,具备View的特性可以平移,缩放等

11、说说你对 Window 和 WindowManager 的理解?

Window是窗口,对Activty,Dialog,Toast等的展示。但是他是个抽象类,具体实现是phoneWindow类.外界访问window的入口是通过windowManger. windowManager和windowMangerService是通过IPC通讯的,从而来管理window

window下面是DocerView,DocerView里面有包含了View,所以view是window的体现,window是view的承载。windowManager则可以操作view:addView,removeView和updateViewLayout

12、谈一谈 Activity、View 和 Window 三者的关系?

window:窗口,phoneWindow是具体的实现类,外部通过windowManager来管理。window和view通过ViewRootImpl进行管理

View:视图

Activity:用来进行视图显示的

三者的关系:

activity创建的时执行attach()来创建phoneWindow,activity和Window进行绑定,activity实现Window的CallBack,当window收到外界改变的时候就会回调给activity来执行。window创建的时候会创建DecorView,他是view的根节点,里面包含了竖向Linealayout,里面是titleBar和contentParent。 DecorView来加载我们的布局文件,然后将activity的视频加载到我们的contentParent上。

activity是通过window来管理view的展示。一个activity对应一个window,一个window对应一个View.

13、Android 中 View 的几种位移方式的区别?

1、设置margin

2、滑动平移

3、seTranslationX,seTranslationY

4、offsetTopAndButtom,offsetLeftAndRight

5、scorllBy,scorllTo

14、为什么 ViewPager 嵌套 ViewPager,内部的 ViewPager 滚动没有被拦截?

因为被上一级的viewpager拦截掉了,需要做滑动冲突处理,重写子类的dispachTouchEvent方法

判断当前页是0或者最后一页,父级处理,否则自己处理

15、请谈谈 Fragment 的生命周期?

生命周期:

onAttach->onCraete->onCreateView->onActivityCreate->onStart->onResume->onPause->onStop->onDestoryView-onDestory

Frgament在ViewPager中的生命周期:因为viewpager配合fragment使用的时候有预加载页面的功能,所以相邻的fragment是已经创建完毕了。切换后不相邻的执行onPause->onStop->onDestoryView

fragment直接数据传递:

1、创建的时候构造方法

2、Bundle传参

3、EventBus

4、回调接口

单Activity多Fragment的优缺点

fragment比activity占用更少的内存空间,使用流畅,更容易控制各个场景是生命周期

优缺点:使用灵活,内存占用低。但是必须依赖Activity,生命周期受Activty的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRM系统主要包括哪些功能?

CRM系统应该要包括的功能总结为3大方向—— 核心必须要具备的功能常见尽量要有的功能可选有了自然更好的功能 以我们公司用的简道云CRM系统模板为例:https://www.jiandaoyun.com 01 核心必须要具备的功能 核心功能决定了系统是否能够被纳入CRM类别,这些…

升级pip

升级pip 报错提示: WARNING: You are using pip version 19.1.1, however version 20.0.2 is available. You should consider upgrading via the ‘python -m pip install --upgrade pip’ command. 解决办法 py -m pip install --upgrade pip记得关掉梯子 如果…

全面重构存储系统,释放AI时代全新数据价值

《失控》作者凯文凯利做出判断: “不管你从事任何商业,你的生意现在就是数据生意。”一言蔽之,数据已是当今商业社会和经济发展的基石。企业的生产研发、经营管理和销售服务等所有环节愈发离不开数据,数实融合的加速为产业发展带来无限可能。…

视频编解码器H.264和H265有什么区别?

对于大型视频文件来说,视频编解码器至关重要,它可以将文件压缩为较小的尺寸,从而可以更轻松地存储和加快传输速度。而两种最常用的编解码器是H.264和H.265,那么它们两者之间有什么区别,哪一个更好呢? 1. 什…

https SSL证书使用 git bash 解密

申请域名证书后,有些证书下载时强制加密。 在使用时,比如在AWS ACM中使用时,不能用加密的证书。所以这里讲下怎么解密。 首先,加密一般加密的是公私钥中的私钥,即private.key。 填写密码,下载证书&#x…

玩转蓝牙墨水屏电子标签(一)点灯

对于垃圾佬的生活来说,每天逛海鲜市场是必不可少的生活片段,这不,手抖一下又刷到了一个东付的电子标价签。 价格合理,2块钱一个不包邮,直接买了N个。。。算了一下一个3.5,然后拿到群去炫耀了下,…

Xilinx FPGA 7系列 GTX/GTH Transceivers (4) Aurora 8b10b 递增数收发验证

第一节:Xilinx FPGA 7系列 GTX/GTH Transceivers (1)–了解了GTX硬件的基础知识 第二节:IBERT GTX --通过Ibert IP测试链路通信 第三节:aurora 8b10b single lane 4byte–学习官方历程 递增数验证 自行编写data_gen和data_check 验证aurora 8b10b SFP 1.25G 收发正确。 组…

用过lsof命令的,都竖起了大拇指!!!

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) …

webpack常用配置与性能优化插件

webpack是一个流行的前端项目构建工具(打包工具),可以解决当前web 开发中所面临的困境。 提供了友好的模块化支持,以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能,从而让程序员把工作的重心放到具体的功能实…

Bigemap如何添加mapbox图源?

会使用到的工具 bigemap gis office,下载链接:BIGEMAP GIS Office-全能版 打开软件,要提示需要授权和添加地图,然后去点击选择地图这个按钮,列表中有个添加按钮点进去选择添加地图的方式。 第一种方式:通…

k8s-2 集群升级

首先导入镜像到本地 然后上传镜像到仓库 在所有集群节点 部署cri-docker k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker 配置cri-docker 升级master 节点 升级kubeadm 执行升级计划 修改节点套接字 腾空节点 升级kubelet 配置k…

MySQL备份及恢复

目录 MySQL备份 MySQL备份方法 备份策略 mysql的完全备份 mysql的增量备份 MySQL恢复 mysql完全恢复 mysql增量备份的恢复 MySQL备份 MySQL备份是基于对MySQL的日志进行备份,且恢复也是通过日志进行数据恢复。 MySQL备份方法 物理备份:直接对…

如何在一个月内通过PMP考试?

新版本考纲,有一个最大的难点。那就是知识点来自《PMBOK指南》,以及《敏捷实践指南》;但是考试大纲给了3个域、35个任务,这些只给了条目性的提纲,对应着考试的实践要求。 考试题目全部是基于情境的选择题,…

苹果开发者账号注册及证书生成方法详解

转载:注册苹果开发者账号的方法 在2020年以前,注册苹果开发者账号后,就可以生成证书。 但2020年后,因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号,所以需要缴费才能创建ios证书了。 所以新政策…

MySQL全局优化与Mysql8.0新增特性

Mysql全局优化总结 ​ 从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。 补充一点配置文件my.ini或my.cnf的全局参数: 假设服务器配置为: CPU:32核内存:6…

包含日志文件

原理:某个PHP文件存在本地包含漏洞,却无法上传正常文件,包含漏洞却不能利用,攻击者就有可能会利用apache日志文件来入侵。 Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日…

Vue3大屏项目实现数字跳动的效果

一、vue-count-to组件&#xff1a; 1、安装&#xff1a; npm install vue3-count-to --save 2、使用&#xff1a; <template><BaseCountTo:startVal"startVal":endVal"endVal":duration"duration":decimals"decimals":pr…

千万级用户的大型网站,如何进行服务器压力预估?

前言&#xff1a;一般情况下&#xff0c;单台Tomcat服务器每秒支撑500请求&#xff0c;单台MySQL数据库每秒支撑5000左右的请求&#xff0c;单台Redis缓存支撑每秒几万请求。 1、千万级用户量的压力预估 假设大型网站预估用户数是1000万&#xff0c;那么根据28法则&#xff0c…

河南分销系统开发怎么做产品分销?

一个好的产品&#xff0c;如何去找好的分销团队来帮自己做分销&#xff0c;首先这里面是好产品是一个相对的一个概念。 首先什么样才叫好产品&#xff0c;像我们来说&#xff0c;经常我们说做分销&#xff0c;我们尽量找一些高频的&#xff0c;有一些竞争力的产品&#xff0c;我…

乖离率BIAS指标选股公式,判断多空力量和超买超卖

乖离率(BIAS)指标用于衡量股价与移动平均线之间的偏离程度&#xff0c;可以用来判断当前市场的多空力量和超买超卖情况。 乖离率的计算公式比较简单&#xff0c;如下&#xff1a; BIAS (收盘价 - N日移动平均价) / N日移动平均价 100 其中&#xff0c;N代表选择的时间周期…