Android面试题(二)
Android面试题系列:
11.广播注册
首先写一个类要继承BroadCastReceiver
第一种:在清单文件中声明,添加
第二种:使用代码进行注册如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
BroadCastReceiverDemo receiver = new BroadCastReceiver();
registerReceiver(receiver, filter);
两种注册类型的区别是:
a.第一种是常驻型广播,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
b.第二种不是常驻广播,也就是说广播跟随程序的生命周期。
12.Android中的ANR
ANR的全称application not responding 应用程序未响应。
在android中Activity的最长执行时间是5秒。
BroadcastReceiver的最长执行时间则是10秒。
Service的最长执行时间则是20秒。
超出执行时间就会产生ANR。注意:ANR是系统抛出的异常,程序是捕捉不了这个异常的。
解决方法:
- 运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法 (如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message 的方式做一些操作,比如更新主线程中的ui等)
- 应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
13.ListView优化
- convertView重用,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收;
- ViewHolder优化,使用ViewHolder的原因是findViewById方法耗时较大,如果控件个数过多,会严重影响性能,而使用ViewHolder主要是为了可以省去这个时间。通过setTag,getTag直接获取View。
- 减少Item View的布局层级,这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间。
- adapter中的getView方法尽量少使用逻辑
- 图片加载采用三级缓存,避免每次都要重新加载。
- 尝试开启硬件加速来使ListView的滑动更加流畅。
- 使用 RecycleView 代替。
14.Android数字签名
- 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
- Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
- 如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名。
- 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
15.Android root机制
root指的是你有权限可以再系统上对所有档案有 "读" "写" "执行"的权力。root机器不是真正能让你的应用程序具有root权限。它原理就跟linux下的像sudo这样的命令。在系统的bin目录下放个su程序并属主是root并有suid权限。则通过su执行的命令都具有Android root权限。当然使用临时用户权限想把su拷贝的/system/bin目录并改属性并不是一件容易的事情。这里用到2个工具跟2个命令。把busybox拷贝到你有权限访问的目录然后给他赋予4755权限,你就可以用它做很多事了。
16.View、surfaceView、GLSurfaceView
View
显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢
SurfaceView
基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView
基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的子类,openGL专用
AsyncTask
AsyncTask的三个泛型参数说明
- 第一个参数:传入doInBackground()方法的参数类型
- 第二个参数:传入onProgressUpdate()方法的参数类型
- 第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型
运行在主线程的方法:
onPostExecute()
onPreExecute()
onProgressUpdate(Progress...)
运行在子线程的方法:
doInBackground()
控制AsyncTask停止的方法:
cancel(boolean mayInterruptIfRunning)
AsyncTask的执行分为四个步骤
- 继承AsyncTask。
- 实现AsyncTask中定义的下面一个或几个方法onPreExecute()、doInBackground(Params...)、onProgressUpdate(Progress...)、onPostExecute(Result)。
- 调用execute方法必须在UI thread中调用。
- 该task只能被执行一次,否则多次调用时将会出现异常,取消任务可调用cancel。
17.Android i18n
I18n 叫做国际化。android 对i18n和L10n提供了非常好的支持。软件在res/vales 以及 其他带有语言修饰符的文件夹。如: values-zh 这些文件夹中 提供语言,样式,尺寸 xml 资源。
18.NDK
- NDK是一系列工具集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和Java应用打成apk包。
- NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需要简单的修改mk文件就可以创建出so文件。
19.启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
通过主界面进入,就是设置默认启动的activity。在manifest.xml文件的activity标签中,写以下代码
从另一个组件跳转到目标activity,需要通过intent进行跳转。具体
Intent intent=new Intent(this,activity.class),startActivity(intent)
作者:零次幂
链接:https://juejin.cn/post/6844903464024145927
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。