今天的面试题,我回来鞭尸了!

来源:互联网 发布:网络雅思课程 编辑:程序博客网 时间:2024/06/04 18:49

2016年2月17日,人生中第一次面试,才知道面试也是要写试卷的!不是口头说说就行的!

请谈一下Android系统的架构。

Android系统采用了分层架构,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

请描述一下Activity生命周期。

共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(),onPause(),onStop(), onDestroy()。

onCreate(): 创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。

onStart(): Activity变为在屏幕上对用户可见时调用。

onResume(): Activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用。

onPause(): Activity被暂停或收回cpu和其他资源时调用,该方法用户保护活动状态的,也是保护现场。

onStop(): Activity被停止并转为不可见阶段及后续的生命周期事件时调用。

onRestart(): Activity被重新启动时调用。该活动仍然在栈中,而不是启动新的Activity。

完整生命周期: 即从一个Activity从出现到消失,对应的周期方法是从onCreate()到onDestroy()。

可见生命周期: 当Activity处于可以用户看见的状态,但不一定能与用户交互时,将多次执行从onStart()到onStop()。

前景生命周期: 当Activity处于Activity栈最顶端,能够与其他用户进行交互时,将多次执行从onResume()到onPause()。

两个Activity之间跳转时必然会执行的是哪几个方法。

两个Activity之间跳转必然会执行的是下面几个方法。

onCreate()//在Activity生命周期开始时调用。

onRestoreInstanceState()//用来恢复UI状态。

onRestart()//当Activity重新启动时调用。

onStart()//当Activity对用户即将可见时调用。

onResume()//当Activity与用户交互时,绘制界面。

onSaveInstanceState()//即将移出栈顶保留UI状态时调用。

onPause()//暂停当前活动Activity,提交持久数据的改变,停止动画或其他占用GPU资源的东西,由于下一个Activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。

onStop()//Activity不再可见时调用。

onDestroy()//Activity销毁栈时被调用的最后一个方法。

 

android中的动画有哪几类,它们的特点和区别是什么?

android支持两种动画模式,tween animation,frame animation
View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。
View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化.
另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

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

 

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

android的数据存储的方式

 

数据存储主要有:
1、通过SharedPreferences方式存储,这类存储主要适用于存储信息量小的操作。具有操作和存储简便,代码简单的特点
2、通过SD卡等磁盘介质存储,这类一般都是存成文件的形式。适用于存储信息量大,操作相对复杂些。
3、通过数据库,一般都是sqlite的方式进行存储,适用于存储信息量适中,这类存储在查询的时候比较方便。而且能很好的支持SQL语句。
4、通过网络方式存储到其他服务器,这类一般适用于CS方式,且存储数据需要集中存储,具有联网的性质。比如网游或者复杂应用。

什么是ANR?如何来避免?

 

应用程序无响应(ANR:Application Not Responding)

默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。

应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR

Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作

潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。

应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。

 

什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

 

导致出现Force Close的原因有很多,常见的有比如空指针,数组越界、类型转换异常。

捕获:可以通过logcat查看抛出异常的代码出现的位置,然后到程序对应代码中进行修改。

避免:编写程序时,要思维缜密,在可能出现异常的地方都作相应的处理,增强程序的健壮性。

Android5大布局的特点

线性布局(LinearLayout):按照垂直或者水平方向布局的组件。

帧布局(FrameLayout):帧布局是从屏幕的左上角(0,0)坐标开始布局,多个组件层叠排列,第一个添加的组件放到最底层,最后添加到框架中的视图显示在最上面。上一层的会覆盖下一层的控件。

表格布局(TableLayout):按照行列方式布局组件。

相对布局(RelativeLayout):相对其它组件的布局方式。

 绝对布局(AbsoluteLayout):按照绝对坐标来布局组件。

你后台的Activity被系统回收怎么办

答案是onSaveInstanceState()
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B
这个时候A会执行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState != null){
long id =savedInstanceState.getLong("id");
}

 

请介绍下ContentProvider是如何实现数据共享的。

 

应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。

ContentProviders是以类似数据库中表的方式将数据暴露, 采用URI来表示外界需要访问的数据。外部访问通过ContentResolver去访问并操作这些被暴露的数据。

简要解释一下activity intentintent filterserviceBroadcaseBroadcaseReceiver

一个activity呈现了一个用户可以操作的可视化用户界面
一个service不包含可见的用户界面,而是在后台无限地运行
可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信
一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面
intent:content provider在接收到ContentResolver的请求时被激活。
activity, service和broadcastreceiver是被称为intents的异步消息激活的。
一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI
Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于 manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。
它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intentfilter也是在manifest文件中声明的

如何将SQLite数据库(dictionary.db文件)apk文件一起发布?

 

可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中。

如何将打开res aw目录中的数据库文件?

 

在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

0 0
原创粉丝点击