写给小白的android基础面试笔试题(一)

序言:由于公司的某些方面原因,LZ最近都处于找工作的状态,年关了,最关键的LZ还只是个没毕业的孩子,所以工作越来越不好找了,到哪里投简历都是动不动就好几年经验,这让我们这些没经验的渣渣还怎么活啊!好了,也不吐槽那么多了,这几天到处去投简历,到处去面试,培训机构,外包公司这些都经历了个遍,总结了一下面试的时候的面试笔试题(如有错误,请及时纠正)

写给小白的android基础面试笔试题(一)

写给小白的android基础面试笔试题(二)

写给小白的android基础面试笔试题(三)

注:每个问题的最后都会有正确答案(粗体的就是正确答案)

1、说说你对Android四大组件的认识?

答:说实话,这种类型的题目我的内心是崩溃的,这个面太广了,不好下嘴说,我当时就是把四大组件一一介绍过去,我觉得这样能笼统的概括,而且后来我发现面试官并不是想问你四大组件是什么,请接着往下看。
四大组件:Activity、Service、Broadcast Receiver、Content Provider

2、Broadcast Receiver在什么情况下能用得到?

答:看到吧!还没等我讲完四大组件,他就开始问广播的用法,以及在什么情况下能用到,我当时回答了两点,一是系统有一些广播有时候需要用到;二是可以替换handler用来作为线程间的通信桥梁。
广播是一种机制,而且是双向的(工作线程可以往主线程发广播,主线程也可以往工作线程发广播),使用的场景有如下几点(只列举几点):
(1)、同一app内部的同一组件内的消息通信(单个或多个线程之间)
(2)、同一app内部的不同组件之间的消息通信(单个进程)
(3)、同一app具有多个进程的不同组件之间的消息通信
(4)、不同app之间的组件之间消息通信
(5)、Android系统在特定情况下与App之间的消息通信

3、请简述一下Activity的生命周期以及在什么情况下会执行相应的生命周期?

答:这个问题由于之前做过实验,分析过Activity以及Fragment的生命周期,所以记得挺牢的。
Activity生命周期:onCreate——>onStart——>onResume——>onRestart——>onPause——onStop——>onDestory
执行生命周期:在Activity创建的时候,会执行onCreate—>onStart—>onResume;
在你进入Activity之后按返回键,会执行onPause—>onStop—>onDestory;
在你进入Activity之后按Home键,会执行onPause—>onStop;
这个时候当你又回到Activity,会执行onRestart—>onStart—>onResume;
当你从A1界面跳转到A2界面时,生命周期的变化如下:
onCreate(A1)—>onStart(A1)—>onResume(A1)—>onPause(A1)—>onCreate(A2)—>onStart(A2)—>onResume(A2)—>onStop(A1);
此时如果在A2界面按下返回键,生命周期会的变化如下:
onPause(A2)—>onRestart(A1)—>onStart(A1)—>onResume(A1)—>onStop(A2)—onDestory(A2);
注:如果A2界面是一个透明主题的话,那么A1不会调用onStop方法

4、请简述一下你对fragment的理解?

答:之前我说了,遇到这类问题的时候你就从fragment是什么以及fragment在什么场景下用的到来入手,一般来说基本答这两点就可以了
fragment被称为碎片,可以作为界面来使用,在一个Activity中可以嵌入多个Fragment,而且Fragment不能单独存在,必须依附于Activity才行,但是Fragment又有自己的生命周期,也能直接处理用户的一些事件,Fragment的生命周期也受依附的Activity的生命周期影响;一般来说Fragment在平板开发中用的比较多,还有就是Tab切换

5、请简述一下Fragment的生命周期?

答:这道题没有问,个人觉得还是有必要了解一下的,技多不压身,哈哈哈!
fragment的生命周期:onAttach——>onCreate——>onCreateView——>onViewCreated——>onActivityCreated——>onStart——>onResume——>onPause——>onStop——>onDestroyView——>onDestroy——>onDetach;
fragment的生命周期大致就这么多,但是还有一个比较常见的就是onHiddenChanged,这个是在切换fragment的时候会执行,至于什么场景下会执行什么,我还是建议你自己动手实验一把;这里还需要注意的是,如果是通过add方法显示fragment,那么切换fragment不会执行其生命周期,只会执行onHiddenChanged方法;如果是通过replace方法显示fragment,切换fragment的时候会重新走生命周期的流程。

6、说说你知道的Android5.0和Android6.0的新功能?

答:这道题我感觉是问你对Android新东西的学习情况,所以我们程序员自学能力一定要强,要向前看,科技在进步(卧槽这尼玛进步的也忒快了点吧!),这题目我肯定没有回答全,5.0我知道的就只是MD风格的界面,通知栏的改变,最近打开的应用程序(这两个是想起来给我爸买的手机是5.0的,我玩过),一般你回答到这我觉得就差不多了,然后你可以再讲讲你怎么使用的就可以了;至于6.0嘛!我只知道权限是要动态配置的,其他我也不晓得了,下面的答案会着重5.0的MD风格和6.0的权限来讲。
Android5.0:又称为Lollipop(棒棒糖),我觉得其最大的改变在于界面风格和交互体验,用的最多的可以说是Material Design设计风格,Recyclerview,CardView等。
Material Design中常用的控件:
(1)、AppBarLayout、ToolBar
(2)、DrawerLayout、NavigationView
(3)、RecyclerView、CardView、AutoScrollViewPager
(4)、CoordinatorLayout、CollapsingToolbarLayout、TabLayout
(5)、TextInputLayout
(6)、FloatingActionButton、Snackbar
对于上面这些控件,我是将他们常在一起搭配使用的放在一起,如果你想更好的了解Material Design,请移步12个Material Design风格控件的使用,一般面试官会着重问RecyclerView,为什么?因为RecyclerView现在正在逐步代替ListView和GridView,它的功能很强大,性能更好(Item的复用不需要自己去维护),如果有兴趣了解更多ListView与RecyclerView的区别的同学,请移步RecyclerView和ListView 使用对比分析。
Android6.0:又称为Marshmallow(棉花糖),我觉得其最大的改变在于用户对权限的管理,我们都知道,6.0以下的Android系统在安装app的时候会默认勾选一些权限,一旦用户安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西,这样感觉起来挺不好的。6.0以后,app将不会在安装的时候授予权限,取而代之的是,app会在运行时一个一个询问用户授予权限。

7、Android的APK瘦身方法你了解多少?

答:这道题,说实话我知道的就是把图片进行压缩和把没用的文件剔除,但是我对与APK包的结构还不是特别了解,所以具体还需要优化什么我也答不上来了。
在这里给大家推荐一个网站,关于图片在线压缩的TinyPNG,然后使用android studio自带工具Lint剔除无用资源(res资源文件),如果你闲的话那就再手动剔除一遍(LZ当年也是这么干的);然后你可以去实验一下,解压一个APK包,然后看看他的内部结构:
(1)、classes.dex:这是java源码编译后生成的java字节码文件
(2)、resources.arsc:这是编译后的二进制资源文件
(3)、AndroidManifest.xml:这个Manifest文件里面都是编译之后的,都是二进制,看不到什么信息
(4)、proguard.cfg:这是代码混淆配置文件
(5)、META-INF:该目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
(6)、res:该目录下存放的是资源文件,但是也是编译之后的,二进制的。
你试过就会知道,真正容量大的就是classes.dex、资源文件,当然了有时候也会有lib目录,lib目录下放的是一些jar包和so包,容量也是挺大的,所以这里我们重点对这三类进行瘦身:
(1)、classes.dex:使用Proguard ,这可以让你在编译的时候对代码进行混淆和优化,删掉不必要的jar包和无用的代码。
(2)、res:使用Lint代码分析器,由于Proguard 只会对Java代码起作用,所以使用我们还得结合Lint工具,来帮你找到无用的资源文件。
(3)、lib:一个硬件设备对应一个架构(mips、arm或者x86),只保留与设备架构相关的库文件夹(主流的架构都是arm的,mips属于小众,默认也是支持arm的so的,但x86的不支持),这样可以大大降低lib文件夹的大小。

8、Android的反编译你有了解吗?(了解),说说你是怎么反编译的,res文件夹是怎么反编译出来的?

答:这道题我想说我之前看过郭神写的一篇博客反编译与混淆技术完全解析,而且当时我的项目中需要实现一个类似像编辑器那种,然后我傻傻的去编译的apk,结果当然是一脸的懵逼啦!这么简单就让你给爬出来的话,那也不用混了,不过也算是对反编译有了一定的认识。
首先我们得知道APK长什么样,在上面那个问题中已经介绍过了,就不再多说,我们都知道,编译之后的APK都是一些二进制什么的,没有什么人类能看得懂的东西,所以我们需要借助工具来帮我们看了:
(1)、dex2jar:这个工具用于将dex文件转换成jar文件。下载地址
(2)、jd-gui:这个工具用于将jar文件转换成java代码。下载地址
(3)、apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。下载地址
具体的反编译内容还是可以去看看郭神写的那篇,比较细致。

9、Android的多渠道打包你了解吗(抱歉,我知道,但是我没做过)?

答:说真的,对Android的APK包接触的还算是少的,因为平时都去研究代码怎么写去了,app上线的工作我就做过两回,还是一年多之前的事,之后只听说过这么个东西,但是还没有实践过。首先得要了解一下啊多渠道打包是什么意思,就算我们没有去实践过,但是你也总得知道点什么,不然到时候面试笔试问到了又是一脸懵逼。
多渠道打包:就是指分不同的市场打包,如安卓市场、百度市场、谷歌市场等等,Android的这个市场有点多,就不一一列举了,多渠道打包是为了针对不同市场做出不同的一些统计,数据分析,收集用户信息。
百度一下多渠道打包,发现用的最多的应该是AndroidStudio用的多的友盟多渠道打包和Eclipse用的多的兰贝壳儿插件多渠道打包,具体的步骤可以参考下面:
友盟多渠道打包:使用Android studio Gradle 实现友盟多渠道打包
兰贝壳儿插件多渠道打包:使用兰贝壳儿Android多渠道批量打包

10、那Android的apk加固你有了解吗(抱歉,我知道,但是我没做过)?

答:这道题我也是回答了一点我自己的见解,其实都是屁话,由于现在Android反编译方法越来越成熟,我们需要加固我们的app,以防止他们随意反编译,就像LZ上述讲到的去编译的app。
APK加固,说白了就是给APK加密,然后再套上一层壳就可以了,现在比较流行的第三方加固平台有,爱加密、梆梆加固、360加固:
(1)、爱加密
(2)、梆梆加固
(3)、360加固
他们的原理都是差不多的,主要的步骤就是:我们拿到需要加密的Apk和自己的壳程序Apk,然后用加密算法对源Apk进行加密在将壳Apk进行合并得到新的Dex文件,最后替换壳程序中的dex文件即可,得到新的Apk,那么这个新的Apk我们也叫作脱壳程序Apk。他已经不是一个完整意义上的Apk程序了,他的主要工作是:负责解密源Apk.然后加载Apk,让其正常运行起来。具体的操作方法可以参考 Android中的Apk的加固(加壳)原理解析和实现

在此感谢上面引用到的博客的博主!!!!

好了,希望LZ的面试经历能对你也有所帮助,接下来我会持续更新我的面试和笔试经历,LZ要接着去找工作了,同时也希望此时正在找工作的人不要放弃,如果你也喜欢编程,喜欢Android,那就坚持下去。

写给小白的android基础面试笔试题(一)_第1张图片
公众号:Android技术经验分享

你可能感兴趣的:(写给小白的android基础面试笔试题(一))