融360 和 FunPlus+:
生命周期:onFinishInflate()--> onAttachToWindow()--> onMeasure()--> onLayout()-->
onDraw()--> onWindowFocusChanged() --> onDetachFormWindow();
- hashmap的实现原理(JDK1.7与JDK1.8的区别)
- 算法: 单链表反转(循环和递归写法),单例模式
- https协议的握手过程(MD5摘要、SHA1、SHA256算法原理,数字签名)-------
- 自定义view的onMeasure方法的执行操作-------
- volatile字段的含义:被它修饰的字段对多线程操作可见--> 对读可见,对写不同步;
- 内存泄漏与内存溢出,区别、举例、预防、检测(LinkCanary、MAT、Android Profiler)
-
apk瘦身-------
- handler机制
-
Application和四大组件启动顺序和相关注意事项:
1、Application的attachBaseContext()方法优先执行;
2、ContentProvider的onCreate()方法比Application的onCreate()方法先执行;
3、Service和Activity 的 onCreate()方法和 BroadcastReceiver的 onReceive()方法,
是在Application的onCreate()方法后执行的;
4、调用流程:Application的attachBaseContext()--> ContentProvider的onCreate()-->
Application的onCreate()--> Service、Activity等的onCreate()(Activity和Service不分先后);
百度 (百家号)
一面
- TCP三次握手
- handler机制
- 内存优化: OOM的处理;资源的及时关闭(cursor、bitmap及时关闭);自定义view时不要再onDraw方法创建过多的对象
- 自定义view的流程;onMeasure、onLayout、onDraw的执行顺序和作用
(view的测量绘制是从viewRootImp的performTranvalce开始。。。)
- 设计一个求大数和(非int、long、bigInteger)的函数:(用string表示大数,转成char数组求和)
- 求单链表中的最大节点(两个指针)
- protobuffer的体积小,传输快的原因
- 单例模式
二面
用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的默认Activity,
ActivityManagerService发现这个应用还未启动,则会通知Zygote进程(fork)孵化出应用进程,
然后在这个dalvik应用进程里执行ActivityThread的main方法。
应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象(applicationthread),
这样ActivityManagerService可以通过这个代理对象控制应用进程,
然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法.
- 项目中用到的cordova框架具体做了哪些平台支持;plugin的加载时机;Android与H5交互的JsBridge的实现原理
- 项目中用到的分时线自定义view
- scrollView嵌套子view需要注意的点(滑动冲突、高度为0的问题)
- apk瘦身的方式
- 长连接的问题
- 在子线程中使用handler
- Android的性能优化(内存优化、布局优化、数据库优化、代码优化)
- oom的处理
- listview或recycleView加载显示图片造成卡顿的优化方案(getview的item复用,图片的压缩剪切、图片缓存)
- classLoder加载一个类的过程
- 获取view的真实尺寸(三种)
第一种 : 使用 getviewtreeobserver().addongloballayoutlistener()来获得宽度或者高度
private int mheaderviewheight;
private view mheaderview;
.....
mheaderview.getviewtreeobserver().addongloballayoutlistener( new ongloballayoutlistener() {
@override
public void ongloballayout() {
mheaderviewheight = mheaderview.getheight();
mheaderview.getviewtreeobserver() .removeglobalonlayoutlistener(this);
}
});
需要注意的是ongloballayoutlistener可能会被多次触发,因此在得到了高度之后,要将ongloballayoutlistener注销掉。
第二种 : view post事件中获取
public class testheight extends activity {
textview tv;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_activity_b);
tv = (textview) findviewbyid(r.id.textview);
tv.post(new runnable() {
@override
public void run() {
int height= tv.getheight();
}
});
}
}
第三种 : 直接测量计算
int intw=view.measurespec.makemeasurespec(0,view.measurespec.unspecified);
int inth=view.measurespec.makemeasurespec(0,view.measurespec.unspecified);
textview.measure(intw, inth);
int intwidth = textview.getmeasuredwidth();
int intheight = textview.getmeasuredheight();
必要商城
1、measure的测量规则 --- view的大小试根据父view的measureMode + view的layout.parame + view的measureMode计算出来的;
2、layout的布局是通过setFrem(l,t,r,b)
3、draw的绘制流程: 绘背景drawBackground() --> 绘内容onDraw() --> 绘子view disoatchDraw() -->
绘装饰(侧边栏,滚动条...)onDrawForeground()
4、可以通过invalid和requestLayout方法请求重绘
- 打印出杨辉三角第N行的数组
- 心跳机制,心跳包的组成
火币网
- activity的启动模式和应用场景
- 面试感想:要与实际相结合,既要懂原理又要知道什么场景下用
人人车
- 插件化和热更新原理(根据市面上流行的框架介绍其原理)
- Android apk DEX和ODEX的区别
我们在原生Android中安装apk会产生apk和odex两个文件,而使用第三方的rom只有apk一个文件。
我们知道普通的Android App编译之后会生成apk,其中的class.dex是其可执行文件。Android App运行的策略也就是解压apk后运行class.dex。
那么odex是什么?
odex是同名apk经系统优化后的dex文件,原生ROM中apk和odex文件是配对的,对应的apk文件中没有了dex(比正常可安装的apk小)。
这样的好处:
1.加快程序的装载与运行
2.防止系统程序的简单复制(防盗链!),针对不同的ROM,odex文件是变化的,不可混用的,否则程序就不能政策运行。
与odex配对的apk文件又因为缺少dex无法单独安装和使用。这也是直接复制带ODEX的程序到其他固件不能运行的原因。
3.节省data分区资源(ODEX解压出来的执行程序是在SYSTEM目录的同名ODEX,DEX版的解压是在DATA区目录,且ODEX文件比DEX文件更小)
网友评论