安卓核心技术面试题(一)
1、描述一下 android 的系统架构
*android 系统架构分从下往上为 linux 内核层、运行库、应用程序框架层和应用程序层。
*Linux kernel:
负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
*Libraries 和 android Runtime:
Libraries:即 c/c++函数库部分,大多数都是开放源代码的函数库,例如 webkit(引擎),该函数库负责 android 网页浏览器的运行,例如标准的c 函数库 libc、openssl、sqlite 等,当然也包括支持游戏开发 2dsgl 和3dopengles,在多媒体方面有 mediaframework 框架来支持各种影音和图形文件的播放与显示,例如 mpeg4、h.264、mp3、 aac、amr、jpg 和 png 等众多的多媒体文件格式。
Runtime:负责解释和执行生成的 dalvik 格式的字节码。
*application framework(应用软件架构):
java 应用程序开发人员主要是使用该层封装好的 api 进行快速开发。
applications:该层是 java 的应用程序层,android 内置 googlemaps、 e-mail、即时通信工具、浏览器、mp3 播放器等处于该层,java 开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。
*应用程序层:
android 应用程序使用框架的 api 并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个applicationframework 进行非常深入的理解。精通applicationframework,你就可以真正的理解 android 的设计和运行机制,也就更能够驾驭整个应用层的开发。
*总结:
下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。
2、Dalvik 和标准 Java 虚拟机之间的主要差别?
Dalvik 和标准 Java 虚拟机(JVM)之间的首要差别之一,就是 Dalvik 基于寄存器,而
JVM 基于栈。
Dalvik 和 Java 之间的另外一大区别就是运行环境——Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用作为一个独立的 Linux 进程
执行。
(1)虚拟机很小,使用的空间也小;
(2)Dalvik 没有 JIT 编译器;
(3)常量池已被修改为只使用 32 位的索引,以简化解释器;
(4)它使用自己的字节码,而非 Java 字节码。
3、Manifest.xml 文件中主要包括哪些信息?
manifest:根节点,描述了 package 中所有的内容。
User-sdk:指定支持的手机系统的最小版本
application:包含 package 中 application 级别组件声明的根节点。
activity:Activity 是用来与用户交互的主要工具。
receiver:IntentReceiver 能使的 application 获得数据的改变或者发生的操作,即使它当前不在运行。
service:Service 是能在后台运行任意时间的组件。
provider:ContentProvider 是用来管理持久化数据并发布给其他应用程序使用的组件。
uses-permission:请求你的 package 正常运作所需赋予的安全许可。
permission: 声明了安全许可来限制哪些程序能你 package 中的组件和功能。
instrumentation:声明了用来测试此 package 或其他 package 指令组件的代码。
4、什么是 Activity?
Activity 是一个负责与用户交互的组件,Activity 中所有操作都与用户密切相关,可以通过 setContentView(View)来显示指定控件。
在一个 android 应用中,一个 Activity 通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
5、请描述一下 Activity 生命周期。
onCreate(Bundle savedInstanceState):
创建 activity 时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():
activity 变为在屏幕上对用户可见时调用。
onResume():
activity 开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():
activity 被暂停或收回 cpu 和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():
activity 被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():
重新启动 activity 时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():
activity 被完全从系统内存中移除时调用,该方法被调用
6、如何退出 Activity?如何安全退出已调用多个Activity 的 application?
在 Android 中退出程序比较麻烦,尤其是在多个 Activity 的程序中,在 2.2 之前可
以采用如下代码退出程序:
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
此种方法是一种最方便和最简单的退出程序的办法,但是在 2.2 和 2.2 之后就不能用了,一种常用的方法是自定义一个 Activity 的栈,在程序退出时将栈中的所有的 Activity进行finish。
7、如果后台的 Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
重写 onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在 activity 被回收之前调用。通过重写 onRestoreInstanceState()方法可以从中提取保存好的数据
8、activity 在屏幕旋转时的生命周期
不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;设置 Activity 的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;设置 Activity 的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。
9、activity 的启动模式有哪些?是什么含义?
在 android 里,有 4 种 activity 的启动模式,分别为:
“standard” (默认)
“singleTop”
“singleTask”
“singleInstance”
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当 Activity 实例创建后就会放入任务栈中。Activity 启动模式的设置在 AndroidManifest.xml 文件中,通过配置
Activity 的属性 android:launchMode=""设置。
1. Standared 模式(默认)
我们平时直接创建的 Activity 都是这种模式的 Activity,这种模式的 Activity 的特点是:只要你创建了 Activity 实例,一旦激活该 Activity,则会向任务栈中加入新创建的实例,
退出 Activity 则会在任务栈中销毁该实例。
2. SingleTop 模式
这种模式会考虑当前要激活的 Activity 实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
3. SingleTask 模式
如果任务栈中存在该模式的 Activity实例,则把栈中该实例以上的 Activity实例全部移除,调用该实例的 newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新
创建一个新的 Activity 实例。
4. SingleInstance 模式
当该模式 Activity 实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的 Activity,都会通过调用实例的 newInstance()方法重用该 Activity,此时使用的都是同一个 Activity 实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的 Activity。
更多面试题请关注微信公众号"demo锁屏面试题",通过关联的小程序或app轻松学习面试题