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大小的限制都是没有问题的。  
  1. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
启动程序(主界面也是一个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.线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
进程 线程 Bundle 全局变量 使用文件共享/数据库 Handler机制 Messenger AsyncTask AIDL View.postDelay(Runnable , long) ContentProvider runOnUiThread(Runnable) Socket BroadcastReceiver

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生命周期
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