Android-简答题
简答题汇总
第1章 Android基础入门
Q1. 请简述Android系统架构包含的层次以及各层的特点。
答案: Android系统架构从高到低分为四层:应用程序层、应用程序框架层、核心类库和Linux内核。(1)应用程序层:核心应用程序的集合,包括短信程序、联系人程序等。(2)应用程序框架层:提供了构建应用程序时用到的各种API。(3)核心类库:包含系统库和Android运行环境。(4)Linux内核:为设备硬件提供底层驱动。
Q2. 请简述Dalvik虚拟机编译文件的过程。
答案: Java源文件经过JDK编译器编译为class文件后,Dalvik虚拟机中的Dx工具会将部分class文件转换成dex文件,dex文件还会在Dalvik虚拟机中进一步优化成odex文件。
Q3. 如果要调用styles.xml文件中的AppTheme主题,请编写实例代码。
答案: (1)在AndroidManifest.xml中配置:<application android:theme="@style/AppTheme">。(2)在Java代码中设置:setTheme(R.style.AppTheme)。
Q4. 请简述如何在Java代码与XML文件中调用布局资源文件。
答案: (1)Java代码中:setContentView(R.layout.activity_main);。(2)XML布局文件中:<include layout="@layout/activity_main"/>。
Q5. 请简述什么是单元测试。
答案: 单元测试包括Android单元测试和Junit单元测试。Android单元测试需要连接Android设备,速度较慢。Junit单元测试不需要依赖Android设备,在本地即可运行,速度快。
Q6. 请简述Log类输出的六个级别的日志信息对应的方法。
答案: 由低到高分别是:Verbose(Log.v())、Debug(Log.d())、Info(Log.i())、Warning(Log.w())、Error(Log.e())、Assert(Log.wtf())。
第2章 Android常见界面布局
Q7. 请简述相对布局中的属性android:layout_alignRight与android:layout_toRightOf的区别。
答案: layout_alignRight用于设置当前控件的右边界与某控件的右边界对齐。layout_toRightOf用于设置当前控件位于某控件的右侧。
Q8. 请使用TableLayout布局实现一个简单的计算器界面。
答案: 使用TableLayout作为根布局,添加多个TableRow作为行,每个TableRow中包含Button控件。例如:第一行放置显示结果的EditText(设置android:layout_span属性跨越多列),后续每行放置数字按钮和运算符按钮。
第3章 Android常见界面控件
Q9. 请简述ImageView控件中的属性android:background与android:src的区别。
答案: 相同点:都可以为ImageView设置图片。区别:android:background不仅可以设置图片也可以设置颜色,图片会根据ImageView大小伸缩;android:src设置的是图片,以原图大小显示。
Q10. 请编写一个程序,实现当点击手机返回键时,使用Toast类提示用户”退出本界面”的信息。
答案: 重写onKeyDown方法,在其中使用Toast类提示信息:Toast.makeText(MainActivity.this, "退出本界面", Toast.LENGTH_SHORT).show()。判断keyCode == KeyEvent.KEYCODE_BACK时执行该提示。
第4章 程序活动单元Activity
Q11. 请简述显式Intent和隐式Intent的区别。
答案: 显式Intent需要明确指定激活组件的名称,通常用于应用内部组件的启动。隐式Intent不明确指定组件名,Android系统会根据隐式Intent使用IntentFilter匹配相应的组件,匹配的属性主要有action、category、data。
Q12. 请简述Activity的四种启动模式及其特点。
答案: (1)standard:每启动一个Activity就会在栈顶创建一个新的实例。(2)singleTop:当被启动的Activity位于栈顶时,复用该Activity实例。(3)singleTask:当被启动的Activity在栈中存在实例时,会直接复用此Activity实例,并把当前Activity上面的所有实例弹出栈。(4)singleInstance:会启动一个新的任务栈来管理该Activity。
Q13. 请简述Fragment的生命周期方法。
答案: Fragment的生命周期方法依次为:onAttach()、onCreate()、onCreateView()、onActivityCreate()、onStart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()。
第5章 数据存储
Q14. 请简述使用SharedPreferences类存储数据的步骤。
答案: 第一步:调用getSharedPreferences()方法获取SharedPreferences对象。第二步:通过edit()方法获得Editor编辑器对象。第三步:使用Editor相关方法(如putString()、putInt()等)存储数据。第四步:通过commit()方法提交保存数据。
Q15. 请简述Android平台提供的五种存储方式。
答案: Android平台提供的五种存储方式分别是:(1)文件存储。(2)SharedPreferences。(3)SQLite数据库。(4)ContentProvider。(5)网络存储。
第6章 内容提供者和内容观察者
Q16. 请编写一个类,实现监测短信数据变化的功能。
答案: 自定义类继承ContentObserver,重写onChange()方法,在onChange()方法中编写监测到数据变化后的处理逻辑。然后通过ContentResolver的registerContentObserver()方法注册content://sms的Uri,即可实现监测短信数据变化的功能。
第7章 广播机制
Q17. 请简述有序广播和无序广播的区别。
答案: 有序广播使用sendOrderedBroadcast()方法发送,按照接收者的优先级顺序依次执行,优先级高的接收者可以拦截广播,也可以修改广播中的数据。无序广播使用sendBroadcast()方法发送,所有接收者异步执行,不能被拦截,效率较高。
Q18. 请简述广播机制的实现过程。
答案: 广播机制的实现过程:(1)广播接收者通过Binder机制在AMS(Activity Manager Service)中进行注册。(2)广播发送者通过Binder机制向AMS发送广播。(3)AMS查找已注册的符合条件的广播接收者。(4)将广播发送到对应的消息循环队列中。(5)回调广播接收者的onReceive()方法处理广播。
第8章 服务
Q19. 请简述Service生命周期中的方法。
答案: Service生命周期中的方法:(1)onCreate():服务首次创建时调用。(2)onStartCommand():通过startService()启动服务时调用。(3)onBind():通过bindService()绑定服务时调用,返回IBinder对象。(4)onUnbind():所有绑定的客户端都解绑时调用。(5)onDestroy():服务销毁时调用。
Q20. 请简述通过bindService()方法启动服务并调用服务中方法的步骤。
答案: (1)在服务内部定义需要被调用的方法。(2)定义Binder类,在Binder类中间接调用服务中的方法。(3)在onBind()方法中返回Binder对象。(4)在Activity中调用bindService()方法绑定服务,通过ServiceConnection的onServiceConnected()回调获取Binder对象。(5)利用获取到的Binder对象调用服务中的方法。
Q21. 请简述通过不同方式启动Service时的生命周期方法。
答案: (1)通过startService()方式启动:onCreate() -> onStartCommand() -> onDestroy()。服务会一直运行,直到调用stopService()方法停止。(2)通过bindService()方式启动:onCreate() -> onBind() -> onUnbind() -> onDestroy()。当所有绑定的客户端解绑后,服务自动销毁。
第9章 网络编程
Q22. 请编写一段代码,使用JSONObject类解析JSON数据{“name”:”zhangsan”,”age”:27}。
答案:
1 | JSONObject jsonObj = new JSONObject(json); |
Q23. 请编写getJson()方法,使用JSONArray类解析数组结构的JSON数据。
答案:
1 | public void getJson(String json) throws JSONException { |
Q24. 请简述Handler消息机制的工作原理。
答案: Handler消息机制的工作原理:(1)Handler通过sendMessage()方法将Message对象发送到MessageQueue(消息队列)中。(2)Looper(循环器)不断地从MessageQueue中取出消息。(3)Looper将取出的消息分发给对应的Handler对象。(4)Handler调用handleMessage()方法处理消息。
Q25. 请简述使用HttpURLConnection访问网络的步骤。
答案: 使用HttpURLConnection访问网络的步骤:(1)创建URL对象,传入网络地址。(2)调用openConnection()方法获取HttpURLConnection连接对象。(3)调用setRequestMethod()方法设置请求方式(GET或POST)。(4)调用setConnectTimeout()方法设置连接超时时间。(5)调用getInputStream()方法获取服务器返回的输入流。(6)对输入流进行解析处理。(7)调用disconnect()方法关闭连接。
第10章 图形图像处理
Q26. 请简述逐帧动画的工作原理。
答案: 逐帧动画的工作原理:按照事先准备好的静态图片顺序进行播放,利用人眼的”视觉暂留”原理,当图片切换速度足够快时,人眼会将连续的静态图片感知为连续的动画效果。
Q27. 请编写一个程序,实现半径为100像素的红色圆形。
答案: 在自定义View的onDraw()方法中编写如下代码:
1 | Paint paint = new Paint(); |
Q28. 请编写一个程序,将一个图片实现透明度渐变动画,时间为1秒。
答案:
1 | AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.0f); |
第11章 多媒体应用开发
Q29. 请简述使用SoundPool类播放音频的步骤。
答案: 使用SoundPool类播放音频的步骤:(1)创建SoundPool对象,指定最大音频数量。(2)通过load()方法加载音频文件到SoundPool中。(3)调用play()方法播放指定的音频。
Q30. 请简述使用MediaPlayer类播放音频的步骤。
答案: 使用MediaPlayer类播放音频的步骤:(1)创建MediaPlayer对象。(2)调用setAudioStreamType()方法设置音频类型。(3)调用setDataSource()方法设置音频数据源。(4)调用prepare()方法准备播放。(5)调用start()方法开始播放音频。(6)调用stop()方法停止播放。(7)调用release()方法释放MediaPlayer资源。


