[ 面试题 ] 四大组件

字数 3751阅读 3708

把之前收集的一些Android面试题发布出来,都是网上能收到的一些题,质量也许不是很高,不过胜在方便,我会把网上能搜到的一些Android面试题都放在这里的,会持续更新,后期也许会分类管理的,希望对新手们有所帮助。
个人认为,这些题目前来说已经不能反映出真实的技术水平了,但至少能反映出面试者对将要面试的这个职位的态度乃至工作的做事的态度。因为我相信,市场上随风飘的面试题,即使不懂原理,但至少可以知道这些答案。
好吧,牛逼吹大了(因为这些题我也不会):),好啦,有需要的同学可以关注 我的专题、收藏本贴。

==============================================================

第一篇 四大组件

Activity
  1. Activity生命周期

  2. 简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver。
    答:
    A.一个activity呈现了一个用户可以操作的可视化用户界面;
    B.一个service不包含可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进行通信;
    C.一个broadcastreceiver是一个接收广播消息并做出回应的component,broadcastreceiver没有界面;
    D.一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的;一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。

  3. 如何将一个Activity设置成窗口的样式?

在AndroidManifest.xml 中定义Activity的地方一句话:android:theme="@android:style/Theme.Dialog"
另外:android:theme="@android:style/Theme.Translucent" 就变成半透明的
  1. Activity的启动模式
  2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
    答:onSaveInstanceState()
    当你的程序中某一个ActivityA在运行时,主动或被动地运行另一个新的ActivityB,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate ()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
  3. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
    答:可以放在不同的Task中。需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。
  4. 如何退出Activity?如何安全退出已调用多个Activity的Application?
    答:
    A. 在2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。注意不要被它的名字迷惑。
    B. 抛异常强制退出:该方法通过抛异常,使程序ForceClose。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
    C. 记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
    D: 发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
    E: 递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
    F: 在2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
  5. 横竖屏切换时候activity的生命周期?
    A. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
    B. 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
    C. 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
  6. Android程序入口如何判断?
    action节点中的android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点
  7. intent和activity的区别?
    Activity活动,可以理解为窗口,是人机交互的核心,所以又被人们说成是所有程序的根本。Intent意图,负责所有Activity窗口通讯。Service服务是相对Activity来说的,不需要人机交互,但可以为Activity提供交互必需要的一些东西。
    Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期. 由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态对于Activity,关键是其生命周期的把握其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent)。
    Intent:Android中提供了Intent机制来协助 应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对 应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。
  • 后台Activity被回收如何恢复?
    重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据
  • Activity的 onSaveInstanceState() 和 onRestoreInstanceState()
    答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
  • Activity中 this、getApplicationContext和getActivity的区别
    this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.
    getActivity()指的是在fragment当中调用得到他所在的Activity
    getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。
Service
  1. android 关于service生命周期的onCreate()和onStart()说法正确的是(ad)(多选题)
    A、当第一次启动的时候先后调用onCreate()和onStart()方法
    B、当第一次启动的时候只会调用onCreate()方法
    C、如果service已经启动,将先后调用onCreate()和onStart()方法
    D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法
  • Service是如何启动
    A. 通过startService;Service会经历onCreate->onStart;stopService的时候直接onDestroy;如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的话,Service会一直在后台运行,下次TestServiceHolder再起来可以stopService。
    B. 通过bindService;Service只会运行onCreate,这个时候TestServiceHolder和TestService绑定在一起,TestServiceHolder退出了,Srevice就会调onUnbind->onDestroyed,所谓绑定在一起就共存亡了。
  • Service用在哪个线程
    默认情况下Service是运行在启动该Service的应用主线程的,如果Service中的操作占用大量的CPU资源或有阻断操作(比如播放MP3或者访问网络)会影响应用主线程的响应性能,甚至会造成“应用程序无响应(ANR)”问题。
  • 简单介绍服务
    服务是没有界面的长生命周期的代码。一个很好的例子是媒体播放器从列表中播放歌曲。在一个媒体播放器程序中,大概要有一个或多个活动(activity)来供用户选择歌曲并播放它。然而,音乐的回放就不能使用活动(activity)了,因为用户希望他导航到其他界面时音乐继续播放。这种情况下,媒体播放器活动(activity)要用Context.startService()启动一个服务来在后台运行保持音乐的播放。系统将保持这个音乐回放服务的运行直到它结束。注意一下,你要用Context.bindService()方法连接服务(如果它没有运行,要先启动它)。当连接到服务后,你可以通过服务暴露的一个接口和它通信。对于音乐服务,它允许你暂停、倒带,等等。
  • service和Thread区别?
    1).Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
    2).Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上
  • 更多内容请查看 Service初识
BroadcastReceive
  1. 广播概述
  • Android引入广播机制的用意?
    答:
    a : 从MVC的角度考虑(应用程序内) ,其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
    b:程序间互通消息(例如在自己的应用程序内监听系统来电)
    c:效率上(参考UDP的广播协议在局域网的方便性)
    d:设计模式上(反转控制的一种应用,类似监听者模式)
Content Provider
  1. ContentProvider的URI的配置?
    清单文件之指定URI或者代码里面指定URI,contentProvider通过URI访问数据
  • contentprovider怎么实现数据共享?
    一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。
  • 如何通过一套标准及统一的接口获取其他应用程序暴露的数据?
    Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
  • ContentProvider和SQL的区别
    Sql只能在该工程的内部共享数据,ContentProvider能在工程之间实现数据共享。
  • Android如何访问自定义ContentProvider
    第一:得到ContentResolver类对象:ContentResolver cr = getContentResolver();
    第二:定义要查询的字段String数组。
    第三:使用cr.query();返回一个Cursor对象。
    第四:使用while循环得到Cursor里面的内容
Intent的原理

intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable或者Parcelable的类型。
Intent可以划分成显式意图和隐式意图:

  • 显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
  • 隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
IntentService有何优点?

Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
  Android的进程处理器现在会尽可能的不kill掉你
  非常容易使用

================================================
更多内容请关注 我的专题
转载请注明 出处:
http://www.jianshu.com/users/c1b4a5542220/latest_articles

推荐阅读更多精彩内容