为帝都金三银四准备的Android面试热点题

一、基本概念

(一)、Android四大组件相关基础问题

Activity、Service、BroadcastReceiver、ContentProvider

1、 Activity基本概念:应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

2、BroadcastReceiver基本概念:应用程序可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

3、service基本概念:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。

4、ContentProvider基本概念:android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。

5、四大组件的基本作用
Acitivity :用于显示界面,接收用户输入,和用户交互。
Service :运行于后台*面的程序,用于在后台完成一下任务,例如:音乐播放等。
BroadCast Receiver :接收系统或应用发出的广播并作出响应,例如:电话的呼入呼出等。
Content Provider :用于把APP本身的数据共享给其他APP,提供本APP数据的存取接口给其他APP

Activity

1、Activity的生命周期


Activity的生命周期

*启动Activity:onCreate->onStart->onResume
*锁屏或被其它Activity覆盖:onPause->onStop
*解锁或由被覆盖状态再回到前台:onRestart->onStart->onResume
*跳转到其它Activity或按Home进入后台:onPause->onStop
*退回到此Activity:onRestart->onStart->onResume
*退出此Activity:onPause->onStop->onDestory
*对话框弹出不会执行任何生命周期(注:对话框如果是Activity(Theme为Dialog),还是会执行生命周期的)
*从A跳转到B:当B的主题为透明时,A只会执行onPause(A-onPause->B-(onCreate->onStart->onResume))
*从A跳转到B:A-onPause->B-(onCreate->onStart->onResume)-A-onStop(注意是A执行onPause后开始执行B的生命周期,B执行onResume后,A才执行onStop,所以尽量不要在onPause中做耗时操作)
*从B返回到A:B-onPause->A-(onRestart->onStart->onResume)-B-(onStop->onDestroy)

2、Activity四种启动模式的区别(LanchMode 的应用场景)

①、standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

②、singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

③、singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

④、singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。 常应用于App主页

3、如何设置Activity的启动模式?
在 AndroidManifest.xml 文件中 Activity 元素的 Android:launchMode 属性。

4、Activity中类似onCreate、onStart运用了哪种设计模式,为什么?
模板模式。每次新建一个Activty时都会覆盖onCreate、onStart等方法,这些方法在父类中就相当于一个模板。

5、如何将一个Activity设置成窗口的样式?
方法一:在AndroidManifest.xml文件中将当前需要改变成窗口样式的属性。

android:theme="@android:style/Theme.Dialog"

方法二:在styles.xml文件中自定义一个主题样式,此主题样式必须继承Dialog的样式.

6、Activity的启动过程
①、通过Launcher来启动Activity或者通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;
②、ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;
③、ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;
④、ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;
⑤、对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;
⑥、ActivityManagerService调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;
⑦、ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。

7、Activity、Window 和 View 三者的区别
①、一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个。
②、这个Window会有一个ViewRoot(View、ViewGroup)。
③、通过addView()加载布局。
④、WindowMangerService 接收消息,并且回到 Activity 函数,比如onKeyDown()。
Activity 是控制单元---Window 是承载模型---View 是显示视图

8、简述onActivityResult(int requestCode, int resultCode, Intent data)方法的作用?
希望在Activity中得到新打开Activity关闭后返回的数据,则需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在最先关闭的Activity中重写onActivityResult(int requestCode, int resultCode,Intent data)方法。

9、内存不足时,怎么保持Activity的一些状态?
在onSaveInstanceState方法中保存Activity的状态,在onRestoreInstanceState或onCreate方法中恢复Activity的状态

10、简述onSaveInstanceState方法作用?
①、用于保存Activity的状态存储一些临时数据
②、Activity被覆盖或进入后台,由于系统资源不足被kill会被调用
③、用户改变屏幕方向会被调用
④、跳转到其它Activity或按Home进入后台会被调用
⑤、会在onStop之前被调用,和onPause的顺序不固定的

11、简述onRestoreInstanceState(Bundle savedInstanceState)方法作用?
①、用于恢复保存的临时数据,此方法的Bundle参数也会传递到onCreate方法中,你也可以在onCreate(Bundle savedInstanceState)方法中恢复数据
②、由于系统资源不足被kill之后又回到此Activity会被调用
③、用户改变屏幕方向重建Activity时会被调用
④、会在onStart之后被调用

12、onRestoreInstanceState和onCreate的区别是什么?
当onRestoreInstanceState被调用时Bundle参数一定是有值的,不用做为null判断,onCreate的Bundle则可能会为null。官方文档建议在此方法中进行数据恢复。

13、如何安全退出已调用多个Activity的Application?
①、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
②、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
③、递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

Fragment

1、Fragment的生命周期


Fragment的生命周期

2、Activity中如何动态的添加Fragment?

//1,获取碎片管理器
FragmentManager fragment=getFragmentManager();
//2,碎片的显示需要使用FragmentTransaction类操作
FragmentTransaction transacction=fragment.beginTransaction();
//获取屏幕管理器和默认的显示
Display display=getWindowManager().getDefaultDisplay();
//判断横屏
if(display.getWidth()>display.getHeight()){
    //获取java类
    Frament1 frament1 =  new Frament1();
    transacction.replace(android.R.id.content, frament1);
}else{
    Frament2 frament2 =  new Frament2();
    transacction.replace(android.R.id.content, frament2);
}
//3、使用FragmentTransaction必须要commit
transacction.commit();

3、简述Fragment 特点
①、Fragment可以作为Activity界面的一部分组成出现;
②、可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;
③、在Activity运行过程中,可以添加、移除或者替换Fragment;
④、Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响;
⑤、Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸;
⑥、Fragment 解决Activity间的切换不流畅,轻量切换;

4、Fragment嵌套多个Fragment会出现bug吗?
会出现三种bug:突变的动画效果、被继承的setRetainInstance、错乱的onActivityResult传递
具体分析:http://blog.csdn.net/megatronkings/article/details/51417510

上一篇:startActivityForResult()和onSaveInstanceState()用法


下一篇:应用程序内部任意界面退出程序