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基类,处理这些共通问题。
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基类,处理这些共通问题。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories