Android 3月2日题: onMeasure是干什么的?
答案:
onMeasure方法主要是用于度量ViewGroup的子view的大小同时确定和保存自己ViewGroup的大小,将xml中的布局信息进行计算,计算出他们需要显示的布局数据。
Android 3月3日题:
手机的运行内存越来越大,为什么加载个大图片就可能导致OOM?
答案:
因为安卓对虚拟机的堆内存做了硬性限制,当进程申请的空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定)
Android 3月4日题:
EventBus是单例的,但是为什么默认构造函数是public的呢?
答案:
EventBus可能有多条总线,订阅者注册到不同线上的 EventBus,通过不同的实例来发送数据,不同的 EventBus 是相互隔离开的,订阅者就都只会收到注册到该线上的事件 。
Android 3月5日题:
Jni静态注册和动态注册
答案:
静态注册:
通过 JNIEXPORT 和 JNICALL 两个宏定义声明,Java + 包名 + 类名 + 方法名形式的函数名。不好的地方就是方法名太长了。
动态注册:
通常在 JNI_OnLoad 方法中通过 RegisterNatives 方法注册,可以不再遵从固定的命名写法(当然为了代码容易理解,名称还是尽量和 Java 中保持一致)
Android 3月6日题:
Android进程的优先级有哪几级?
答案:
前台进程、可见进程、服务进程、后台进程、空进程
Android3月9日题:
父容器调用哪个方法可以拦截子View的事件?为什么?
答案:
调用onInterceptTouchEvent()并返回true。因为该方法返回true后,会导致变量 intercepted = true,从而导致不会走后面分发事件的代码。
Android3月10日题:Binder为什么安全性高?
答案:
1.为每个APP分配不同UID,通过UID鉴别进程身份;
2.即支持实名Binder,又支持匿名Binder;
Android3月11日题:AIDL 中 in,out,inout 的区别?
答案:
AIDL中的定向 tag 表示了在跨进程通信中数据的流向,其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。其中,数据流向是针对在客户端中的那个传入方法的对象而言的。in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的参数为空的对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。
Android3月12日题:Android程序员在职业生涯中如何规划自己?(今天是开放性的每日一题,大家可自由发挥快来说出你的想法)
答案:
1.选择比努力更重要,选择有两个方向,第一是选择企业,第二是选择技术方向
2.节奏很重要,通俗的话就是,工作要有计划和时间观念,不能一味地通过延长时间来完成工作,尽量保持固定的上下班时间和睡眠时间,而且要安排一些锻炼在生活中只有掌控自己的节奏才能在工作和健康的生活中达到一个平衡的度)
3.未雨绸缪很重要,天有不测风云人有旦夕祸福
4.创建自己的总体计划,创建总体计划时,最大限度地发扬长避短,然后把这个总体计划应用于自己必须解决的每个问题中。
(关于职业规划的问题没有对错,因为每个人的路都不一样,所以这个只能给大家作为一些参考,希望可以给你一些启发)
Android3月13日题:你是如何理解MVP模式的?
答案:
MVP架构由MVC发展而来。在MVP中,M代表Model,V代表View,P代表Presenter。
模型层(Model):主要是获取数据功能,业务逻辑和实体模型。
视图层(View):对应于Activity或Fragment,负责视图的部分展示和业务逻辑用户交互
控制层(Presenter):负责完成View层与Model层间的交互,通过P层来获取M层中数据后返回给V层,使得V层与M层间没有耦合。
在MVP中 ,Presenter层完全将View层和Model层进行了分离,把主要程序逻辑放在Presenter层实现,Presenter与具体的View层(Activity)是没有直接的关联,是通过定义接口来进行交互的,从而使得当View层(Activity)发生改变时,Persenter依然可以保持不变。View层接口类只应该只有set/get方法,及一些界面显示内容和用户输入,除此之外不应该有多余的内容。绝不允许View层直接访问Model层,这是与MVC最大区别之处,也是MVP核心优点。
Android3月16日题: retrofit的原理
答案:
通过java接口以及注解来描述网络请求,并用动态代理的方式,在调用接口方法前后(before/after)注入自己的方法,before通过接口方法和注解生成网络请求的request,after通过client调 用相应的网络框架(默认okhttp)去发起网络请求,并将返回的response通过converterFactorty转换成相应的数据model,最后通过calladapter转换成其他数据方式(如rxjavaObservable)
Android3月17日题:retrofit为什么要使用动态代理
答案:
因为1个静态代理只服务1种类型的目标对象
若要服务多类型的目标对象,则需要为每种目标对象都实现一个静态代理对象 ,在目标对象较多的情况下,若采用静态代理,则会出现 静态代理对象量多、代码量大,从而导致代码复杂的问
题,而动态代理只需要1个动态代理类就可以解决创建多个静态代理的问题,避免重复、多余代码 更强的灵活性设计动态代理类(DynamicProxy)时,不需要显式实现与目标对象类
(RealSubject)相同的接口,而是将这种实现推迟到程序运行时由JVM来实现
在使用时(调用目标对象方法时)才会动态创建动态代理类 & 实例,不需要事先实例化
Android3月18日题:raw文件夹和assets文件夹有什么区别
答案:
raw : Android会自动的为这目录中的所有资源文件生成一个ID,这意味着很容易就可以访问到这个资源,甚至在xml 中都是可以访问的,使用ID访问速度是最快的。
assets : 不会生成ID,只能通过AssetManager访问,xml中不能访问,访问速度会慢些,不过操作更加方便。
Android3月19日题:什么是零拷贝技术?
答案:
"零拷贝"中的"拷贝"是操作系统在I/O操作中,将数据从一个内存区域复制到另外一个内存区域. 而"零"并不是指0次复制, 更多的是指在用户态和内核态之前的复制是0次。
浅析Linux中的零拷贝技术
Android3月20日题:Fragment默认缓存一帧的原理是什么?
答案:
Fragment其实是没有默认缓存的,之所以有这个说法是因为大家都是采用ViewPager+ Fragment的方案,然后用一个宿主Activity+多个Fragment的方案,在这个方案中,ViewPager是默认缓存一帧页面的,而这个页面是Fragment,因而就有了fragment默认缓存一帧的说法。
Android3月23日题:动态代理的缺点是什么?
答案:效率低
相比静态代理中直接调用目标对象方法,动态代理则需要先通过Java反射机制 从而 间接调用目标对象方法
应用场景局限
因为Java 的单继承特性(每个代理类都继承了 Proxy 类),即只能针对接口 创建 代理类,不能针对类 创建代理类
即只能动态代理 实现了接口的类
Android3月24日题:Android Studio插件开流程是怎样的?
答案:
在Intelij中新建项目
新建Action以设置菜单
在Action关联的类中进行功能开发
开发完成生成对应的插件包
Android3月25日题:怎么定位 NDK中的问题和错误
答案:
一般在开发阶段的话,我们可以通过log 来定位和分析问题。
如果是上线状态(即关闭了基本的log),我们可以借助 NDK 提供的 addr2line 工具和
objdump工具来定位错误。详情:
so动态库崩溃问题定位(addr2line与objdump)
其它还可以使用 C/C++ 的一些分析工具。
Android3月26日题: retrofit是如何把接口转换为请求
答案:
Android3月27日题:AOP的优点是什么?一般在什么地方使用?
答案:
AOP是 Aspect Oriented Programming的缩写,中译文为面向切向编程
优点:降低耦合度、提高可重用性、提高可读性。
使用地方:动态权限申请、登入框架、日志打印、线程切换、埋点统计等等
Android3月30日题:ART是什么?
答案:ART是在Android4.0引入并在Android5.0中设为默认解决方案的主要特性之一。ART取代了Dalvik,但是前者与后者仍然保持了字节码级的兼容。ART的主要特征之一就是安装时对应用的AOT编译。这种方式的主要优点就是优化 产生的本地代码性能更好,执行起来需要更少的电量。劣势在于安装文件所需的空间和时间。在Android 6.0中, 大的应用需要数分钟才能安装完。
但是在Android N开发者预览版包含了一个混合模式的运行时。应用在安装时不做编译,而是解释字节码,所以可以快速启动。ART中代码在执行期间被分析,分析结果保存起来。然后,当设备空转和充电的时候,ART会执行针 对“热代码”进行编译,生成app image文件,并且在启动时一次性把它们加载到缓存。
Android3月31日题:我们可以使用自定义的对象作为键吗?
答:可以,但是我们需要自定义它的equals方法和hashcode方法
转载自安卓2020年3月每日一题