Android面试指南-面霸之路08-android常见面试题05

  • Android自定义权限的作用
  • 什么时候使用自定义权限?
  • 和android:exported有什么区别?
  • 为什么很多第三方服务集成,都需要你自己定义权限?比如小米推送,为什么你要加上permission和use-permission两项?

1.自定义权限主要是用来限制对本应用程序或者其他应用程序的特殊组件或功能的访问,如果startActivity()或者startActivityForResult()的调用者没有授予相应权限,那么启动会失败。自定义权限的节点详细信息可以参考官方API Guide Permission,完成权限自定义后可以在和、、、分别设置(PS:每个组件的权限设置还有些不一样),表示客户端与应用程序交互的权限许可,如果没有设置权限,那么默认权限为中的权限,如果两个都没有设置那么该Activity不会被权限保护。总结一下,自定义权限主要还是保护某些组件和功能的可访问性。

2.首先说一下android:exported = [true | false]的功能主要是该组件是否可以被其他应用程序启动或者交互,既然是组件的属性那么就可以分别应用到、、、,更详细说明可以参考API Guide App Manifeset,当然官方最后说了要完成保护组件也可以使用自定义权限。

3.不加权限就无法访问或者调用对应组件。


  • 如何缩减APK包大小

代码

保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs。
使用proguard混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小。
native code的部分,大多数情况下只需要支持armabi与x86的架构即可。如果非必须,可以考虑拿掉x86的部分。

资源

使用Lint工具查找没有使用到的资源。去除不使用的图片,String,XML等等。
assets目录下的资源请确保没有用不上的文件。
生成APK的时候,aapt工具本身会对png做优化,但是在此之前还可以使用其他工具如tinypng对图片进行进一步的压缩预处理。
jpeg还是png,根据需要做选择,在某些时候jpeg可以减少图片的体积。
对于9.png的图片,可拉伸区域尽量切小,另外可以通过使用9.png拉伸达到大图效果的时候尽量不要使用整张大图。

策略

有选择性的提供hdpi,xhdpi,xxhdpi的图片资源。建议优先提供xhdpi的图片,对于mdpi,ldpi与xxxhdpi根据需要提供有差异的部分即可。
尽可能的重用已有的图片资源。例如对称的图片,只需要提供一张,另外一张图片可以通过代码旋转的方式实现。
能用代码绘制实现的功能,尽量不要使用大量的图片。例如减少使用多张图片组成animate-list的AnimationDrawable,这种方式提供了多张图片
  • 内存泄露检测有什么好方法?

使用Android studio分析内存泄露

检测: 1、DDMS Heap发现内存泄露 dataObject totalSize的大小,是否稳定在一个范围内,如果操作程序,不断增加,说明内存泄露 2、使用Heap Tool进行内存快照前后对比 BlankActivity手动触发GC进行前后对比,对象是否被及时回收

定位: 1、MAT插件打开.hprof具体定位内存泄露: 查看histogram项,选中某一个对象,查看它的GC引用链,因为存在GC引用链的,说明无法回收 2、AndroidStudio的Allocation Tracker: 观测到期间的内存分配,哪些对象被创建,什么时候创建,从而准确定位


  • Android开发中XML解析方式的比较 ,及优缺点

DOM,SAX,Pull解析。

SAX解析器的优点是解析速度快,占用内存少;

DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源,不适合移动端;

PULL解析器的运行方式和SAX类似,都是基于事件的模式,PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

  • HttpURLConnection和HttpClient他们各自的优缺点是什么

HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推荐使用 HttpClient,但是 google 现在已经不维护 HttpClient 了,5.1里面已经把 HttpClient 标过期。另外 HttpURLConnection 支持gzip压缩等,推荐首选它。


  • 谈谈你在工作中是怎样解决一个bug的

思路大体和上面差不多, 1. 异常附近多打印log信息; 2. 分析log日志,实在不行的话进行断点调试; 3. 调试不出结果,上Stack Overflow贴上异常信息,请教大牛(我是不会说百度的,^_^) 4. 再多看看代码,或者从源代码中查找相关信息 5. 实在不行就GG了,找师傅来解决! 以上


  • 在Handler机制如果MessageQueue队列为空,loop()方法中死循环while(true){...}是否会退出,为什么

如果MessageQueue为空,取消息时就阻塞了,不会继续执行,直到队列中有消息。

  • 好的编程习惯

Android 开发最佳实践

https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.md


  • 声明ViewHolder内部类时,为什么建议使用static关键字

这个是考静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。当你将内部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。大家会说一般ViewHolder都很简单,不定义为static也没事吧。确实如此,但是如果你将它定义为static的,说明你懂这些含义。万一有一天你在这个ViewHolder加入一些复杂逻辑,做了一些耗时工作,那么如果ViewHolder是非静态内部类的话,就很容易出现内存泄露。如果是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 所以将 ViewHolder内部类 定义为静态的,是一种好习惯

  • Android系统的启动过程

1,通过打开adb shell 然后执行ps命令,我们可以看到首先执行的是init方法!然后我们找到init.c这个文件, 2,然后走init里面的main方法,在这main方法里面执行mkdir进行创建很多的文件夹,和挂载一些目录, 3,然后回去初始化init.rc这个配置文件!在这个配置文件里面回去启动孵化器这个服务,这个服务会去启动app_process这个文件夹,这个文件夹里面有个app_main.cpp这个文件! 4,然后在app_main.cpp这个c文件里面在main方法里面它会去启动安卓的虚拟机,然后安卓虚拟机会去启动os.zygoteinit这个服务! 5,zygoteinit这是个java代码写的,然后我们找到了main方法,在这个方法里面我们看到他首先设置虚拟机的最小堆内存为5兆,然后走到preloadclasses()这个方法来加载安卓系统所有的2000多个类通过类加载器加载进来,比如activity,contentx,http,...(其实没有必要一下子全部加载下来,我们可以等用到的时候在加载也可以!) 6,然后又走preloadresources()这个方法来预加载安卓中定义好的资源比如颜色,图片,系统的id等等。。。都加载了!(其实这也是没必要的! ) 7,然后又走startSystemServer(),这个方法来加载系统的服务!他会先使用natvieJNI去调用C去初始化界面和声音的服务,这就是我们为什么先听到声音和界面的原因! 8,最后等服务加载完成后也就启动起来了! 简之: linux启动->init进程启动(加载init.rc配置)->zygote启动->systemServer启动,systemServer会通过init1和init2启动navite世界和java世界。

  • Android应用方法数量超过65K个怎么办

使用Android Studio 的gradle 可以构建MutilDex

  • 谈谈你对StrongReference、WeakReference和SoftReference的认识
强引用(StrongReference):就是在代码中普遍存在的,类似Object obj = new Object()这类的引用,只要强引用还存在,GC永远不会回收掉被引用的对象。

软引用(SoftReference):用来描述一些还有用但非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常时,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实习软引用。

弱引用(WeakReference):也是用来描述非必须对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到了下一次GC发生之前。当GC工作时,无论当时内存是否足够,都会回收只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。

虚引用(PhantomReference):这个引用po主没有提到,不过也可以顺带了解一下。虚引用也称幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用的唯一目的就是在这个对象被GC回收是收到一个系统通知。在JDK 1.2之后提供了PhantomReference类来实现虚引用。
  • 你应用中的网络层是怎么设计的?

Android网络框架

用现成的一些框架 然后根据项目需要自己再封装下,比如说你的交互数据是JSON格式的,你就可以用一个网络请求框架+fastjson ,然后写一些Bean 在Work线程把数据用fastjson 直接解析成对象返回,最后对一些错误统一处理

我用的是 android-async-http. 封装了下常用的方法,get post 上传 下载 ,所有的请求我都是用的同步请求. 具体的用法一般都是和业务逻辑在一起,而我的业务逻辑是用异步去处理的. 关于网络请求结果的缓存,我是单独处理的.并没有放在网络层.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值