1.Android 的四大组件有哪些? | Activity、Service、ContentProvider、BroadcastReceiver |
---|---|
2.请描述下 Activity 的生命周期? | onCreate、onStart、onResume(前台可见)、onPause(可见,不可触摸)、onStop(应用处于后台)、onDestroy、onRestart(从onStop处触发)。默认情况下,如果我们不给 Activity 设置横竖屏配置信息的话,在横竖屏切换时会将一个 Activity 销毁掉然后重新创建 |
3.如何将一个 Activity 设置成窗口模式? | 将 Activity 的样式设置成:android:theme="@android:style/Theme.Dialog |
4.如何退出 Activity?如何安全退出已调用多个 Activity 的 Application? | 调用 Activity 的 finish 方法可以退出当前 Activity。可以自定义一个 Application,在 Application中声明一个成员变量 ArrayList 用于存放打开的 Activity,当退出时遍历 ArrayList,依次调用 Activity的 finish 方法。 |
5.请介绍下 Android 的五种布局 | LinearLayout、RelativeLayout、FrameLayout、GridLayout、TableLagout |
6.请介绍下 Android 的数据存储方式 | SharedPreference、XML、SQLite、文件系统 |
7.DDMS 和 TraceView 的区别 | DDMS 的全称是 Dalvik Debug Monitor Service,是 Android 开发环境中的 Dalvik 虚拟机调试监控服务。TraceView 是程序性能分析器 |
8.说说 Activity、Intent、Service 以及他们之间的关系 | Activity 负责界面的显示和用户的交互,Intent 封装了数据,可以实现 Activity 之间以及 Activity和 Service 之间数据的传递。Service 运行在后台进程,一般我们会让给其运行一些后台任务,Activity通过 StartService(Intent)或BindService(Intent)可以启动 Service |
9.请介绍一下 ContentProvider 是如何实现数据共享的 | 我们可以定义一个类继承 ContentProvider,然后覆写该类的 insert、delete、update 等方法,在这些方法里访问数据库等资源。同时将我们 ContentProvider 注册在 AndroidManifest 文件中,其他应用需要使用的时候只需获取 ContentResolver,然后通过 ContentResolver 访问即可。 |
10.Fragment 跟 Activity 之间是如何实现值传递的? | Activity 可以先获取 FragmentSupportManager 或者 FragmentManager,前者是v4 包下的,向下兼容因此用的比较多。然后这些 Manager 通过 Fragment 的 tag 或者 id 调用findFragmentByTag(“tag”),findFragmentById(“id”)找到我们需要的 Fragment 对象,然后通过调用 Fragment 对象的方法来进行值的传递 |
11.Android 中都有哪些组件需要在清单文件中注册? | 一般来说四大组件都需要在 AndroidManifest.xml 中进行注册,不过其中 Activity、Service、ContentResolver 是必须注册的,而 BroadCastReceiver 可以在清单文件中注册,也可以不注册,这也分别叫做静态注册和动态注册 |
12.View 的绘制过程 | View 绘制是从根节点(Activity 是 DecorView)开始,他是一个自上而下的过程。View的绘制经历三个过程:Measure、Layout、Draw |
13.ListView 的优化 | ListView 的优化有多种多样的策略。在我们的项目中主要做了如下优化。1、重用ConvertView,2、给 ConvertView 绑定 ViewHolder,3、分页加载数据,4、使用缓存。前两个是通用的解决方案,后两个是针对我们业务的个性化解决方案。我们的数据来自服务端,如果服务端有 1000条数据的话,我们客户端不可能傻瓜式的一次性用 ListView 把这些数据全部加载进来,因此我们就用分页加载数据,每次加载 20 页,当用户请求更多的时候再获取更多数据,网络的访问就算网速再快也多多少少会有一定的延迟,因此我们的网络请求是异步处理的,同时从网络加载来的数据使用了 2 级缓存来处理,第一级是内存级别的缓存,第二级是本地文件的缓存。当 ListView 加载数据的时候首先从内存中找,如果找不到再去本地文件中找,只有都找不到的情况下才去请求网络 |
14.Java 的异常体系 | 顶层是 Throwable 接口,往下分了两大类,一个 RunntimeException 另一个是普通的 Exception。道 RunntimeException 就是运行时异常,在运行的时候才能被 jvm 发现导致程序的终止,而普通 Exception 必须进行 try、catch处理,或者在方法上用 throws 声明。 |
15.OOM 异常(图片加载) | Android 的每一个应用都是一个 Davlik 虚拟机,该虚拟机的默认堆内存只有 16M,远远无法跟我们的 PC 机比较,因此和容易导致 OOM(Out Of Memory)异常的产生。导致这样的异常主要有以下原因:1、加载大图片或数量过多的图片,因为图片是超级耗内存的,2、操作数据库的时候 Cursor 忘记关闭,3、资源未释放,比如 io 流,file 等,4、内存泄露。 |
16.图片是怎么处理 | 图片的处理主要用两种方式。我们的应用中有两处用到了图片,一个是 ListView 中展示的图片缩略图,这种情况的特点是数量大,但是单个图片内存小,只有几 kb,另外一种是大图片,就是用户通过手机拍摄的图片,然后通过 http 的 post 提交的方式提交到服务器上。然后在客户端将这个大图片也展示出来。对于第一种情形,我们是通过三种技术手段来解决问题的,一是图片的缓存策略,二是 ListView 的优化,其实在上面我已经讲过,三是 WeakRefrence(弱引用)的使用。对于第二种情形,我们主要是首先通过 BitmapFactory.Options 参数获取图片的宽和高,然后再根据我们 ImageView 的宽高对图片进行一个很大比例压缩 |
17.弱引用是怎么使用 | WeakRefrence 是一个类,在 ArrayList 中我们把这个类作为对象传递进去,把我们的图片放在 WeakRefrence 里面,这样当 davlik 虚拟机内存不够用的时候,就会把 WeakRefrence 对象回收掉,这样我们在 WeakRefrence 里面保存的数据也被回收了 |
18.Activity 销毁前,如何保存 Activity 的状态? | 可以使用 onSaveInstanceState(Bundle)方法将 Activity 中需要的数据保存起来,当下次重新启动 Activity 的时候在 onCreate(Bundle)中获取 Bundle 数据 |
19.AIDL 的全称是什么?如何工作?能处理哪些类型的数据? | Android Interface Definition Language,② AIDL 一般用于远程服务,也就是进程间通信。我们可以分服务端和客户端,服务端声明 AIDL 文件,该文件命名为 xxx.aidl,ADT 会自动将 xxx.aidl 生成代码文件,代码文件提供了 aidl 中接口的实现。客户端如果要使用服务端提供的服务需要将 xxx.aidl 文件放到客户端源代码目录下,然后生成 xxx.java 类,客户端通过 bindService 的形参 ServiceConnection 的 onServiceConnected 获取到 Service 对象,这个对象通过 Stub.asInterface(service)返回 aidl 的实现类。之后我们就可用调用这个 aidl 的实现类。③ 基本数据类型都可以,复杂对象也可以,只不过需要实现 Parcelable 接口。 |
20.请介绍一下 handler 机制? | Android 中 handler 多用于主线程和子线程之间的通信,比如在 Android 中子线程是不允许修改UI 的,如果修改只能让子线程给主线程通过 handler 发送 message,然后主线程进行修改。Handler整个机制的实现,还依赖 Looper、Message 两个核心内容。在主线程中 Android 默认给我们创建了Looper |
21.java 如何调用 c、c++语言? | java 通过 JNI 调用 C/C++代码,在使用的时候首先通过 System.loadLibrary(“xxx”)将 xxx.so 文件加载到 jvm 中,同时在类中必须对 so 文件中的方法进行声明,格式:public native void test(); |
22.Android 分几层,分别是什么? | 四层。Linux Core、Libraries(Android Runtime)、Application Framework、Applications。 |
23.final、finally、finalize 的区别? | 第一个是关键字最终,用 final 修饰的类为最终类,不能被继承,修饰的方法不能被覆写,修饰的变量不能被改变。finally 是异常体系中的关键字,当系统遇到异常是,在进行 trycatch 的时候,finally代码块里的代码是必须被执行的。finalize 是 Object 类中的方法,当 GC 回收对象时回调的方法。 |
24.heap 和 stack 的区别? | 堆和栈。栈存放对象的引用,堆存放对象实体。堆中的对象是由 jvm 的垃圾回收器负责回收。 |
25.Activity 和 Task 的区别及启动模式有哪些? | :Activity 运行 Task 中。Activity 有四种启动模式。standard、singleTop、singleTask、singleInstance。standard:默认的启动模式,多个 Activity 位于同一 Task 中。singleTop,顾名知义就是 Task 栈顶只能有一个相同的 Activity,singleTask 就是一个 Task 中只有一个 Activity,singleInstance 就是一个Activity 独享一个 Task。 |
26.Android 有哪些安全机制? | 权限机制。我们的应用只要涉及到了用户的隐私、网络都需要在 AndroidManifest.xml 中进行声明,这样用户在安装的时候可以根据你申请的权限进行判断是否允许应用的某些行为 |
27.Thread 和 AsyncTask 的区别是什么? | AsyncTask 是封装好的线程池,比起 Thread+Handler 的方式,AsyncTask 在操作 UI 线程上更方便,因为 onPreExecute()、onPostExecute()及更新 UI 方法 onProgressUpdate()均运行在主线程中,这样就不用 Handler 发消息处理了; |
28.说说 MVC 模式的原理,在 Android 中的运用。 | MVC 是 Model、View、Controller 三部分组成的。其中 View 主要由 xml 布局文件,或者用代码编写动态布局来体现。Model 是数据模型,其实类似 javabean,不过这些 JavaBean 封装了对数据库、网络等的操作。Controller 一般由 Activity 负责,它根据用户的输入,控制用户界面数据的显示及更新model 对象的状态,它通过控制 View 和 Model 跟用户进行交互 |
29.App 在什么情况下会出现内存泄露?如何避免这些情况? | 造成内存泄露的可能性有很多,我说几种吧,1)资源未及时释放,比如引用的 io 流资源、网络资源、数据库游标 Cursor 等没有释放 2)注册的监听器、广播等未及时取消 3)集合对象没有及时清理 4)不良代码.避免上述问题,主要还看程序员知识掌握的程度和编码经验的多少,但是从技术角度考虑我们需要注意一些细节,比如,重复使用的资源可以考虑使用缓存技术、池技术。使用的任何资源都记得关闭或者异常处理,保证在恶劣的情况下也能使资源得到释放。对于图片的操作要注意缓存的使用,同时要记住对图片对象进行及时的回收。使用 ListView 的时候,尽量让 ConvertView 得到复用 |
android面试题目收集
最新推荐文章于 2019-07-17 11:58:06 发布