您的位置:首页 > 职场人生

Android面试题积累三

2016-06-18 15:08 399 查看
1.什么是ANR,如何避免它?

ANR:Application Not Responding

在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况是,就会出现ANR:

对输入事件(如按键、触摸屏事件)的响应超过5秒;意向接收器(IntentReceiver)超过10秒仍未执行完毕。

Android应用程序完全运行在一个独立的线程中。这就意味着,任何在主线程中运行的,需要消耗大量事件的操作都会引发ANR。

因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法,如onCreate()和onResume()。潜在的比较耗时的操作,如访问网络和数据库,或者是开销很大的计算,比如改变位图的大小,需要在一个单独的工作线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束。取而代之的是,主线程为工作线程提供了一个句柄(Handler),让子线程在即将结束的时候调用它。使用这种方法设计你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入时间超过5秒钟不被处理而产生ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。

2.横竖屏切换时候activity的生命周期

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次(但是亲自试验只有一次。。。还求大神解答)。

设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个声明周期,切横,竖屏时只会执行一次。

设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个声明周期,只会执行onConfigurationChanged方法。

3.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?

AsyncTask<String, Integer, Bitmap>

第一个泛型决定了execute方法和doInBackground方法的参数

第二个泛型决定了onProgressUpdate方法的参数

第三个泛型决定了doInBackground方法的返回值

AsyncTask运行的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。

缺陷:AsyncTask维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException.

解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠,否则请求AsyncTask继续处理。

4.Intent详解

四大组件:Activity,Service,Content Provider,BroadcastReceiver

Intent就是连接四大组件的桥梁。

Intent不仅可以用于应用程序之间,也可以用于应用程序内部的activity,service,BroadcastReceiver之间的交互。

向Activity,Service,BroadcastReceiver发送intent有什么不同的机制:

A.使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个activity。使用Activity.setResult(),传入一个intent来从activity中返回结果。

B.将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给Context.bindService来绑定一个Service

C.将intent对象传给Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则他们被传给BroadcastReceiver。

 

Intent的相关属性:

component(组件):目的组件

action(动作):用来表现意图的行动

category(类别):用来表现动作的类别

data(数据):表示动作要操作的数据

type(数据类型):对于data范例的描写

extras(扩展信息):扩展信息

5.如何退出Activity

A.抛异常强制退出:该方法通过抛出异常,使程序Force Close。验证可以,但是,需要解决的问题时,如何使程序结束掉,而不弹出Force Close窗口。

B.记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

C.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

D.递归退出,在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nonsensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,没有影响到用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息