Android 面试题笔记
来源:互联网 发布:应用物理学 知乎 编辑:程序博客网 时间:2024/06/08 09:03
前言
本文记录一些网上看到和自己面试过程中遇到的Android面试的经典题型,具体的答案是博主结合百度自己的解答,仅供参考。
如果有误,欢迎指正,一起交流,共同进步。
2017.08.21
1.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
内存溢出:程序运行需要的内存,超出了它可用的最大内存。 内存泄漏:程序使用完内存空间后没有及时释放。 内存优化: 1. 针对内存溢出:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。 2. 针对内存泄漏:对于比较耗资源的对象及时的关闭,如文件系统,Service等。
2.什么是Handler消息机制?
详情请看:Handler消息传递机制
主要是为了解决多线程问题,因为android只允许UI线程修改UI组件,这时需要借助Handler的消息机制在新线程周期性的改变UI组件。 Message:Handler接收和处理的消息对象。 Looper:每个线程只能有一个Looper。loop方法负责读取MessageQueue中的消息,读取消息后交给发送该消息的Handler进行处理。 MessageQueue:消息队列,先进先出的方式管理Message。创建Looper对象时,同时创建MessageQueue对象。 由Looper负责管理,即使用Handler机制处理消息时,当前线程必须有一个Looper对象。 UI线程:自动初始化Looper对象,直接处理即可。 子线程:调用Looper.prepare()方法即可。
3.Activity间通过Intent传递数据大小有没有限制?
40K。 否则会不正常关闭,错误:FAILED Binder Transaction。
4.如果有个100M大的文件,需要上传至服务器中,而服务器form表单最大只能上传2M,可以用什么方法?
使用http协议上传数据,特别在Android下,跟form没什么关系。传统的在web中,在form中写文件上传,其实浏览器所做的就是将我们的数据进行解析组拼成字符串,以流的方式发送到服务器,且上传文件用的都是POST方式,POST方式对大小没什么限制。回到题目,可以说假设每次真的只能上传2M,那么可能我们只能把文件分割(截断),然后分别上传了。
5.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?
AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。 缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。 解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。
6.Activity用SharedPreferences保存数据,大小有木有限制?
SharedPreferences的底层是由xml实现的,操作SharedPreferences的过程就是xml的序列化和解析的过程。 Xml是储存在磁盘上的,因此考虑到IO速度问题,SharedPreferences不适宜频繁操作.同时序列化xml就是将内存中的数据写到xml文件中,由于dvm的内存是很有限的,因此单个SharedPreferences文件不建议太大,具体多大是没有一个明确的要求的,但是我们知道DVM堆内存也就是16M,因此数据大小肯定不能超过这个数字。 其实SharedPreferences设置的目的就是为了保存用户的偏好和配置信息的,因此建议不要保存太多的数据。
7.Dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?
Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的liunx uid(user id),每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程。
8.assest文件夹里放文件,对于文件的大小有没有限制?
assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在AndroidXML文件中引用到assets目录下的文件,只能通过AssetManager来访问。这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。理论上只要打包不超过AndroidAPK 60M大小的限制都是没有问题的。
- 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
启动程序(主界面也是一个app),发现了在这个程序中存在一个设置为<category android:name="android.intent.category.LAUNCHER"/>的activity。 所以这个launcher会把icon提出来,放在主界面上。当用户点击icon的时候,发出一个Intent:Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);mActivity.startActivity(intent); 不同的是从icon的点击启动的intent的action是相对单一的,从程序中跳转或者启动可能样式更多一些。 本质是相同的。
10.程序之间的亲和性的理解?
1、默认情况下一个应用的所有Activity都是具有相同的affinity,都是从application中继承,application的affinity默认就是manifest的包名。 2、affinity对Activity来说,就像是身份证一样,可以告诉所在的Task,自己属于其中的一员。 3、应用场合: a:根据affinity重新为Activity选择合适的宿主Task; b:与allowTaskReparenting属性配合; c:启动Activity使用Intent设置了FLAG_ACTIVITY_NEW_TASK标记。
11.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
可以。 1. Activity启动模式中,如果将Acvtivity的启动模式设置为singleInstance模式如果将要启动的Activity不存在,先创建一个全新的Task.2. 为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。
12.横竖屏切换时候Activity的生命周期?
详情请看: Android Activity的横竖屏切换与状态保存
调用的生命周期: onPause()----->onStop()------>onDestroy()-------->onCreate(Bundle savedInstanceState)------>onStart()------>onResume()1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期. 3、设置Activity的android:configChanges="orientation|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
13.AIDL的全称是什么?如何工作?
具体如何使用见:Android AIDL进程通信机制详解
全称是:Android Interface Define Language(安卓接口定义语言),是Android为方便进程间通信而设计的一门语言。 AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,适用于进程通信的并发执行。
14.Android事件的分发机制?
Android View事件分发机制学习笔记
Android ViewGroup事件分发机制学习笔记
1. Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。 2. 如果ViewGroup找到了能够处理该事件的View,则直接交给子View处理,自己的onTouchEvent不会被触发。
15.Service的启动方式?区别?生命周期?
1. startService(),当程序通过startService()启动Service时,Service与访问者基本不存在关联,所以也无法进行通信与交换数据。onCreate()-----onStartCommand()-----onDestory()2. bindService(),当访问者需要与Service进行方法调用,交换数据,应该使用bindService()与unbindService()方法启动关闭Service。onCreate()-----onBind()------onUnBind()-----onDestory()
2017.09.21
1.自定义一个组件,需要重写那些方法?
1. 必须要重写的是构造方法,必须用super关键字,继承父类的属性。2. 根据组件的属性重写onDraw(),onMeasure(),onLayout()。2. 其余可以根据自定义的需求,重写对应的方法。
2.XML布局优化
详情:Android性能优化之:XML布局文件优化
1. 减少XML中的布局嵌套,多使用RelativeLayout,减少LinearLayout的使用。2. 使用include标签将重复的界面布局独立出来。3. 使用Merge标签代替布局文件中的根节点,减少布局嵌套。4. 使用ViewStub标签来代替需要隐藏的布局,ViewStub在初始状态时不会被加载出来,不会浪费资源
3.Bitmap内存优化
1. 如果bitmap过大,使用BitmapFactory类方法进行压缩。2. 使用recycle()方法自动回收。3. Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。通常,在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。4. 缓存通用的Bitmap对象,避免新建多个Bitmap对象,造成内存的浪费。
2017.09.24
1.Android四大组件简介
1.活动(Activity): 1).包含用户界面的组件,主要用于与用户进行交互,表现功能。 2).不同的Activity可以通过,Intent进行跳转,相互之前传递数据。 3).完成的生命周期,4中启动模式。 4).虽然有着较长的生命周期,相较于其他3种是最长的,但是为了避免ANR错误,尽量避免耗时操作。 5).不允许进行网络请求操作,阻塞UI线程(主线程).2.服务(Service): 1).后台运行服务,不提供界面呈现。 2).不会专门启动单独的进程,Service与其所在的应用位于同一进程。不是一条新线程,不应该处理耗时的任务。 3).启动方式分为两种:startService()&&bindService(),3.广播接收器(BroadcastReceiver): 1).本质上只是一个系统级的监听器,专门负责各程序发出的广播。 2).生命周期很短,只有10秒,不宜耗时操作。 3).分为动态注册与静态注册两种注册方式。 4).分为标准有序广播,有序广播,还有一些特殊的粘性广播,本地广播等。4.内容提供商(ContentProvider): 1).不同应用程序之间实现数据共享。提供完整的机制,还能保证数据安全。 2).可以选择只提供哪一部分数据,不会有泄露隐私数据的风险。 3).ContentProvider以某种Uri的形式对外提供数据,其他应用则通过 Uri去访问数据。 4).ContentProvider通过暴露自己的操作的内部数据接口,无论应用程序是否启动,其他程序通过接口操作该应用的接口的 内部数据,包括增删查改。但是不同的是我们可以重写这些方法阻止其他程序的“非法操作”。
2.活动被回收了怎么办?怎么保存活动的状态?
1.重写onSaveInstanceState()方法,该方法会携带一个Bundle类型参数,用于保存数据。 2.onCreate()方法的Bundle类型参数,携带者着onSaveInstanceState()保存的数据,取出即可。
3.活动(Activity)四种启动模式?
1.standard:标准模式,默认的加载模式。启动同一个Activity会不断创建新的实例。不会使用新的Task。2.singleTop:Task栈顶单例模式。 a.当要启动的Activity已经位于Task顶时,不会创建新的实例,而是直接复用。 b.如果要启动的的activity没有位于Task顶,则会重新创建acticity实例,并加到栈顶,此时与standard模式完全相同。 3.singleTask:Task内单例模式。 a.如果将要启动的Activity不存在,系统会创建目标Activity的实例,并加入栈顶。 b.如果该Activity已经位于栈顶,此时与singleTop模式相同。 c.如果已经存在但是没有位于栈顶,系统会将该Activity上的所有Activity移出栈顶,是目标Activity转入栈顶。将该Activity转入栈顶。4.singleInstance:全局单例模式。 a.如果将要启动的Activity不存在,先创建一个全新的Task,再创建目标Activity的实例,并加入栈顶。 b.Activity已经存在,无论位于那个应用程序中,位于哪个Task中,系统会把该Activity所在的Task转到前台, 是该Activity显示。
4.Android进程与线程的区别?进程间通信方式?线程间通信?
详情:Android 进程与线程总结
1.在默认情况下同一app的所有组件都是运行在同一进程中.2.当应用程序启动后,系统将会创建一个主线程(UI线程)来运行应用程序。3.一个进程可以拥有多个线程执行任务,这些线程可以共享该进程分配到的资源。4.进程间相互独立,同一进程的线程共享数据空间。某进程内的线程在其它进程不可见。5.线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
5.简单介绍MVP模式?优点?缺点?
详情:MVP模式&简单实例
(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity或者Fragment); (2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合; (3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合); (4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。优点:1.降低代码的耦合性。2.使代码的更加的整洁,逻辑更加清晰,代码的维护和修改更加简便。 3.将工作分解,从而进行专业化分工合作;能减少变更时各层之间的影响。 4.能简化自动化测试用例的编写等。缺点:1.要掌握好度,对于十分简单的功能,也要分的稀碎,就有点过度设计之嫌了。 2.增加app的体积,代码量增多,一个activity多写三个类。
6.Binder机制?
详情:Android 简单总结Binder通信机制
Binder基于Client-Server通信模式,是Android系统中的一种IPC进程间通信结构。 1. 安全,可以阻止那些恶意进程无法直接和其他进程通信,安全性得到提升。2. 高效,而Binder只要1次数据拷贝,在手机这种资源紧张的情况下很重要。
2017.10.16
1.关闭Activity的几种方式?
1.finish()2.System.exit(0);3.android.os.Process.killProcess(android.os.Process.myPid());4.this.onDestroy();5.ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); manager.restartPackage(getPackageName());
2.Activity生命周期?
详情请看:Activity生命周期
3.Android View的绘制流程?
详情请看: Android视图绘制流程完全解析,带你一步步深入了解View(二)
每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure()、onLayout()和onDraw().1.Measure过程:onMeasure():测量视图的大小。2.layout过程:onLayout():给视图进行布局的,也就是确定视图的位置。3.Draw过程:onDraw():真正地开始对视图进行绘制。
2017.10.25
1.Fragment生命周期?
详情请看:Fragment生命周期
onAttach()----onCreate()-----onCreateView()-----onActivityCreated()-----onStart()----onResume()-------onPause()-----onStop()-------onDestoryView()------onDeatory()------onDetach()
2.ImageView的scaleType属性?
1.Center 2. fitXY 3.fitCenter 4.centerInside 5.centerCorp
- Android 面试题笔记
- Android面试题(一)(笔记)
- android学习笔记——面试题
- Android面试题笔记(一)
- Android面试题笔记(二)
- Android 面试题笔记-------android五种布局及其作用
- Android 面试题笔记-------android中动画的设定方式
- 面试题笔记
- 面试题笔记1
- 面试题笔记2
- 面试题笔记3
- 面试题笔记
- Java面试题笔记
- Java笔记--面试题
- 面试题笔记
- 面试题笔记
- java面试题笔记
- Java 面试题笔记
- http://blog.csdn.net/wrp920227/article/details/54588238
- PAT_1080. Graduate Admission
- linux入门
- 像Linux终端一样使用windows命令行【cmder】
- flume (日志收集系统)
- Android 面试题笔记
- 隐藏inputtype=file后,用click()方法弹出附件弹窗
- TensorFlow简单例子
- 算法模板之欧拉函数
- PCL编程->基于PFH特征匹配测试
- ubantu16 中 Sublime3无法输入中解决方案
- IO同步,异步,阻塞,非阻塞 -- 傻傻分不清楚
- Django初学
- 超长字符串