android 面试题总结

来源:互联网 发布:星空抽奖软件 编辑:程序博客网 时间:2024/06/03 19:16

转载http://blog.csdn.net/lmj623565791/article/details/24015867/

1.请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。
在主线程中,主线程会调用looper.prepare()初始化looper(),将looper放入ThreadLocal ,接着调用looper.loop()不断循环遍历MessageQueue。
Handle创建依赖当前的线程looper,如果没有looper则调用looper.prepare(),初始化looper(),通过sendMessage将消息插入MessageQueue中,looper()遍历MessageQueue获取消息,回调handleMessage处理消息。

2.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
内存溢出就是软件运行需要的内存,超出他可用的最大内存
内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放
内存优化:android最容易内存溢出的就是图片加载,我们可以使用图片压缩和LruCache缓存图片来控制图片所使用的内存。
对消耗资源对象及时关闭,如:Database,传感器,service。

3.Activity用SharedPreferences保存数据,是什么格式存储,大小有木有限制?
保存数据的格式是xml 大小没有限制。

4.图片缓存策略
android中图片三级缓存策略:内存、文件、网络(未完待续)

5.启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

启动程序的时候,在这个程序中存在一个设置为<category android:name="android.intent.category.LAUNCHER" />的activity 这个launcher会吧icon放到桌面,用户点击icon的时候会发出Intent,Intent intent=mActivity.getPackageManager().getLaunchIntentForPackage(packageName);mActivity.startActivity(intent);   

跳转过去可以跳到任意允许的页面,如一个程序可以下载,那么真正下载的页面可能不是首页(也有可能是首页),这时还是构造一个Intent,startActivity.
这个intent中的action可能有多种view,download都有可能。系统会根据第三方程序向系统注册的功能,为你的Intent选择可以打开的程序或者页面。
唯一不同的是从icon点击启动是相对单一的,从程序中跳转或者启动样式更多一点,本质是相同的。

6.activity的四中启动模式
1.standard(标准模式)
系统默认模式,每次启动activity都会重新创建一个新的实例,不管这个实例是否已经存在。被创建的实例的生命周期符合经典条件下的activity生命周期。
2.singleTop(栈定复用模式)
这个中模式下面,如果新的activity已经位于任务栈的栈顶,那么此时的activity不会重新被创建,同时他的onNewIntent方法被调用,通过次方法的参数我们可以取出当前请求的信息。需要注意的是,这个activity的onCreate,onStart不会被系统调用,因为他并没有发生改变,例如:

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。

3.singleTask(栈内复用模式)
这是一种单实例模式,在这种模式下面,只要activity在一个栈中存在,那么多次启动
次activity都不会重新创建实例,系统也会调用其onNewIntent。当一个具有singeTask模式的activity请求启动后,比如activityA,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建后的A实例后放入栈中。如果存在A的任务栈,这时要看A是否栈中有实例存在,如果有实例,那么系统会把A调到栈顶并调用他的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。
4.singInstance(单实例模式)
这是一个加强的singleTask模式,他除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此模式的activity只能单独位于一个任务栈中,换句话説,activityA是singleInstance模式,当A启动的时候,系统会创建一个新的任务栈,然后A单独在这个 新的任务栈中,由于栈内复用的特性,后续请求均不会创建新的activity,除非这个独特的任务栈被系统销毁了

7.横竖屏切换时候Activity的生命周期。

1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏会执行一次,切竖屏会执行两次
2.设置activity的android:configChanges=”orientation”时,切屏是还是重新调各个生命周期,横竖屏各执行一次
3.设置activity的android:configChanges=”orientation|keyboardHidden”是,切屏不会调用各个生命周期,只会调用onConfigurationChanged()方法;

8.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记

9.如何把activity封装成对话框的样式

第一种方法,在styles.xml文件中,可以新建如下的类似Dialog的style。<style name=“Theme.FloatActivity” parent=“android:style/Theme.Dialog”> </style>。第二种方法,在AndroidManifest.xml中在需要显示为窗口的Activity中添加如下属性:  android: theme=“@style/Theme.FloatActivity”即可。也可以直接添加对应需要展示为Dialog style的Activity的android: theme属性为android: theme=“@ android: style/Theme.Dialog”。

10.Fragment和activity的生命周期都有那些关联。

11,Activity间通过Intent传递数据大小有没有限制?
有大小限制(具体多少百度 小学生不敢瞎说)

12.android的动画有哪些
1.补间动画(Tween Animation)
平移动画、缩放动画、旋转动画、透明度动画

2.帧动画(Frame Animation)
主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片,图片过多容易出现oom

3.属性动画(Property Animation)
是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,主要包括ValueAnimator和ObjectAnimator

13.如何修改 Activity 进入和退出动画
使用overridePendingTransition

14.描述一下 android 的系统架构
从下到上:
linux kernel(linux内核层),runtime Library(运行库)(library和android runtime),application Framework(应用软件架构),application(应用层)

15.android线程通信有几种方式

共享内存(变量)
文件,数据库,
handler;
java里的wait(),notity(),notityAll();

16.Android的存储方式
1.使用sharePrefrences存储数据,它是android提供的用来存储一些简单的配置信息一种机制,采用了xml格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
2.文件存储数据
(未完待续)

1 0
原创粉丝点击