【Android】面试题及解析

1、下列哪些语句关于内存回收的说明是正确的?(B)

 A、程序员必须创建一个线程来释放内存
 B、内存回收程序负责释放无用内存
 C、内存回收程序允许程序员直接释放内存
 D、内存回收程序可以在指定的时间释放内存对象

解析:
 Android是一款基于Linux内核、面向移动终端的操作系统。主要包含下面几个层次:
 1. Application Framework

Application Framework 将整个操作系统分隔成两个部分。对应用开发者而言,所有 APP 都是运行在 Application Framework 之上,而并不需要关心系统底层的情况。Application Framework 层为应用开发者提供了丰富的应用编程接口,如 Activity Manager,Content Provider,Notification Manager,以及各种窗口 Widget 资源等。在 Application Framework 层,Activity 是一个 APP 最基本的组成部分。一般每个 Activity 对应于屏幕上的一个视图(或者说一屏),一个 APP 可以有一个或者多个 Activity。应用程序被打包成 .apk 格式的文件,由 Dalvik VM 解释执行。

 2. Dalvik VM

Dalvik 虚拟机采用寄存器架构,而不是 JVM 的栈结构。Java 程序编译后的 .class 文件并不能在 Dalvik 中解释执行。因此 Google 提供了一个 dx 工具,用于将 .class 文件转换成 Dalivk 能够识别的 .dex 格式。具体 Dalvik VM 的细节不是本文重点,以下不再讨论。

 3. Linux kernel

由上所述,所有的 APP 都是由 Java 代码编写并在 Dalvik VM 中得到解释执行。在 Android 操作系统中,每个 Dalvik VM 的每个 Instance 都对应于 Linux 内核中的一个进程。可以使用 adb shell 工具查看系统中的当前进程。

android内存回收机制:

  当应用程序退出时,并不需要清理其所占用的内存,Linux内核进程也相应的继续存在,从而使得用户调用程序时能在第一时间得到响应。当Android会在系统需要更多内存时,去释放占用内存的进程。
  在Application Farmework中,Android基于进程中运行的组件及其状态规定了默认的五个回收优先级:
   · Empty process(空进程):没有任何东西在运行的进程。
   · Background process(后台进程):启动后被切换到后台的进程
   · Service process(服务进程):拨号、邮件存储等
   · Visible process(可见进程):不在前台,但是用户可以看见的进程,如输入法、天气、时钟等
   · Foreground process(前台进程) :目前正在屏幕上显示的进程和一些系统进程。
  系统需要进行内存回收时最先回收空进程,然后是后台进程,已此类推最后才回收前台进程。ActicityManagerService集中管理所有进程的内存资源分配。所有进程需要申请或释放内存之前必须调用ActivityManagerService对象,获得其“许可”后才能进行下一步操作。类ActivityManagerService中涉及到内存回收的几个重要的成员方法如下 :trimApplications(),updateOomAdjLocked(),activityIdleInternal() 。这几个成员方法主要负责 Android 默认的内存回收机制,若 Linux 内核中的内存回收机制没有被禁用,则跳过默认回收。

2、Intent传递数据时,下列的数据类型哪些可以被传递?(ABCD)

 A、Serializable
 B、charsequence
 C、Parcelable
 D、Bundle

3、Android中下列属于Intent的作用的是(C)

 A、实现应用程序的数据共享
 B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面也消失
 C、可以实现界面间的切换,可以包含动作和动作的数据,连接四大组件的纽带
 D、处理一个应用程序整体性的工作

4、什么是ANR,如何避免?

 ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务复杂监视应用程序的响应,当用户操作在5s内应用程序没能做出响应,Broadcast Receiver在10秒内没执行完毕,就会出项应用程序无响应对话框,这就是ANR。
 避免方法:Activity应该在它的关键生命周期方法(如:onCreate()和onResume())里尽可能少的去减少创建操作。潜在的耗时操作,例如网络或者数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程中完成。主线程应该为子线程提供一个handler,以便完成时能够提交给主线程。

5、横竖屏切换时activity的生命周期?

 1. 不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
 2. 设置activity的android:configChanges=“orientation”时,切屏还是会重新调用各个生命周期,切横竖屏只会执行一次。
 3. 设置activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
横竖屏切换时,保存或者恢复数据demo:https://github.com/zzhuazi/SavedOrRestoreInstanceState.git

6、Handler、Looper消息队列模型,各部分的作用?(异步消息处理机制)

 1、Message
 Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于不同的线程之间交换数据。可以使用what字段、arg1、arg2携带一些整型数据,使用obj字段携带一个Object对象。
 2、Handler
 Handler就是处理者的意思,它主要用于发送和处理消息,发送消息一般在主线程构造一个Handler,在其他线程调用Handler的sendMessage()方法,此时主线程的MessageQueue中会插入一条message,然后被Looper使用。
 3、MessageQueue
 MessageQueue是消息队列,每个线程中只会有一个MessageQueue对象,单链表维护,在插入和删除上有优势。主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理。在其next()中会无限循环,不断判断是否有消息,有就返回这条消息并移除。
 4、Looper
 Looper创建时会创建一个MessageQueue,调用loop()方法时消息循环开始(死循环),会不断调用MessageQueue的next()方法,当有消息就传递到Handler的handlerMessage()方法中处理,否则阻塞在messageQueue的next()中。当Looper的quit()被调用的时候会调用messageQueue的quit(),此时next()会返回null,然后loop()方法也跟着退出。每个线程中也只会有一个Looper对象。
 5、系统的主线程在ActtivityThread的main()为入口开启主线程,其中定义了内部类Activity.H定义了一系列消息类型,包括四大组件的启动和停止。
 6、MessageQueue和Looper是一对一的关系,Handler和Looper是多对一的关系。

猜你喜欢

转载自blog.csdn.net/J675620982/article/details/81394796