所在位置:首页 > 技术社区 > 技术新闻 >

4个安卓面试题及答案

时间:2016-05-11 16:55:28 来源:北大青鸟广州新嘉华学校 作者:小狮 已有人浏览

导语

这里北大青鸟广州新嘉华学校老师将来介绍一些安卓面试题和答案,以供安卓面试者参考使用,不周之处请指正。1、你后台的Activity被系统回收

这里北大青鸟广州新嘉华学校老师将来介绍一些安卓面试题和答案,以供安卓面试者参考使用,不周之处请指正。
1、你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个ActivityA 在运行时中,主动或被动地运行另一个新的ActivityB  这个时候A会执行
Java代码
1.public
2.void onSaveInstanceState(Bundle outState) {
3.super.onSaveInstanceState(outState);
4.outState.putLong("id", 1234567890);
5.}
public
voidonSaveInstanceState(BundleoutState){
super.onSaveInstanceState(outState);
outState.putLong("id",1234567890);
}
B完成以后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。
北大青鸟广州新嘉华老师表示,savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
1.if(savedInstanceState != null){
2.long id = savedInstanceState.getLong("id");
3.}
if(savedInstanceState!= null){
longid=savedInstanceState.getLong("id");
}
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...
2、调用与被调用:我们的通信使者Intent
要说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent,这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:
Java代码
1.Intent intent = new Intent();
2.intent.setAction(Intent.ACTION_CALL);
3.intent.setData(Uri.parse("tel:" + number));
4.startActivity(intent);
Intentintent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
北大青鸟广州新嘉华老师表示,扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:
Java代码
1.Intent intent = new Intent(this, MyActivity.class);
2.intent.getExtras().putString("id", "1");
3.tartActivity(intent);
Intentintent = new Intent(this, MyActivity.class);
intent.getExtras().putString("id","1");
tartActivity(intent);
第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
android:name="android.intent.action.VIEW"
/>
android:value="android.intent.action.EDIT"
/>
android:value="android.intent.action.PICK"
/>
android:name="android.intent.category.DEFAULT"
/>
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
 
北大青鸟广州新嘉华老师表示,这里面配置用到了action,data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定
mimeType才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:
Startingactivity: Intent {action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker}}
再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
3、什么是ANR如何避免它?
答:ANR:ApplicationNot Responding,五秒
在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intentbroadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束--也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。
4、什么情况会导致ForceClose ?如何避免?能否捕获导致其的异常?
答:一般像空指针啊,可以看起logcat,然后对应到程序中来解决错误。Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

开班信息

Java就业班 01-22 立即报名
WEB基础班 02-28 立即报名
Python基础班 01-22 立即报名
架构师基础班 02-28 立即报名
ACCP基础班 01-22 立即报名
网络工程师 02-28 立即报名
ACCP就业班 01-22 立即报名
Java基础班 02-28 立即报名

申请免费线下试听名额

姓 名:

手 机:

课 程: