虚拟机
1、Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
2、DVM和ART
- Dalvik采用的是JIT技术,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而ART采用Ahead-of-time(AOT)技术,应用在第一次安装的时候,字节码就会预先编译成机器码,这个过程叫做预编译
- ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序除错以及性能分析
Activity面试题
1、生命周期
2、启动模式
3、Intent和Bundle的区别?
- 传递的区别:两者都可以传递对象和值,如果是多个之前Activity之间传递的话,Bundle就比Intent方便
另外一个例子 如果我现在有 Activity A ,B ,C;
现在我要把值通过A经过B传给C,你怎么传 如果用Intent的话, A-B先写一遍,再在B中都取出来 然后在把值塞到Intent中再跳到C,累吗?
如果我在A中用了 Bundle 的话,我把Bundle传给B,在B中再转传到C ,C就可以直接去了 ,这样的话 还有一个好处,就是在B中,还可以给Bundle对象添加新的 key - value ,同样可以在C中取出来
- 另外Bundle可以用于恢复数据,在onCreate和onSaveInstance方法中,传递参数类型就是Bundle
4、横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
Fragment面试题
1、Fragment的创建方式
- 静态创建
- 动态创建
2、生命周期
3、Fragment与Activity、Fragment之间的通信
- FragmentManager.findFragmentById(),这种方法适用静态添加有id的Fragment,动态添加的那就无法查找,
- interface,接口回调,
- LocalBroadcastManager,广播是最简单灵活,
- Fragment直接调用Activity中public方法,((MainActivity) getActivity()).showProByName(name);
4、Fragment的方法
- add( )
- remove( )
- replace( )
5、ListFragment、DialogFragment等等
8、Fragment之我的解决方案:Fragmentation
Service面试题
BroadcastReceiver
1、分类
- 普通广播
- 有序广播
- 系统广播
- App内部广播,LocalBroadcast
- 粘性广播,5.0&Api21以上不用了,在Android系统粘性广播一般用来确保重要的状态改变后的信息被持久保存,并且能随时广播给新的广播接收器,比如电源的改变,因为耗电需要一个过程,前一个过程必须提前得到,否则可能遇到下次刚好接收到的广播后系统自动关机了,随之而来的是kill行为,所以对某些未处理完的任务来说,后果很严重
2、广播注册的方式
3、两种注册方式区别在哪?
ContentProvider
架构模式和开源库
1、MVC、MVP以及MVVM模式讲解
2、RxJava和RxAndroid
设计者模式
2、观察者模式 ——
Native App、Web App以及Hybird App开发
性能优化专题
Android App优化, 要怎么做?
1、ANR
2、UI卡顿
3、内存泄漏
4、内存溢出
5、BitMap
UI卡顿
1、UI卡顿原理
View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象
2、UI卡顿的原因分析
- 在UI线程中做轻微的耗时操作,导致UI线程卡顿
- 布局Layout过于复杂,无法在16ms内完成渲染
- 同一时间动画执行的次数过多,导致CPU和GPU负载过重
- overDraw,导致像素在同一帧的时间内被绘制多次,使CPU和GPU负载过重
- View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染
- 频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms内无法完成绘制
- 冗余资源及逻辑等导致加载和执行缓慢
- ANR
3、UI卡顿的优化
- 布局优化
- 使用include、ViewStub、merge
- 不要出现过于嵌套和冗余的布局
- 使用自定义View取代复杂的View
- ListView优化
- 复用convertView
- 滑动不加载
- 背景和图片优化
- 缩略图
- 图片压缩
- 避免ANR
- 不要在UI线程中做耗时操作
Android UI 适配
1、Android中dp dip、px和sp
- dp = dip
- px = dp * ( dip / 160 ), 标准是160dip
- sp用于显示文字,
/**
* Converts an unpacked complex data value holding a dimension to its final floating
* point value. The two parameters <var>unit</var> and <var>value</var>
* are as in {@link #TYPE_DIMENSION}.
*
* @param unit The unit to convert from.
* @param value The value to apply the unit to.
* @param metrics Current display metrics to use in the conversion --
* supplies display density and scaling information.
*
* @return The complex floating point value multiplied by the appropriate
* metrics depending on its unit.
*/
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
View控件类
1、ListView和RecycleView使用区别
- RecycleView封装了viewHolder的回收复用,编写的Adapter面向的是ViewHolder不再是view;
- RecycleView的布局更丰富,更加解耦,使用LayoutManager来管理,GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager
- RecycleView可以控制item增删的动画,通过ItemAnimator这个类进行控制
- ListView有setEmptyView这个数据为空api,HeaderView 和 FooterView实现上拉刷新,下拉加载更多api
- 局部刷新,ListView有Adapter的notifyDataSetChanged整体,没有局部刷新,需要手动写,RecycleView有notifyItemChanged用于单个item刷新
- 嵌套滚动,
2、RecycleView的拖拽效果实现---ItemTouchHelper
3、ListView为什么没有过时
ListView是采用的RecycleViewBin的回收机制,对于一些轻量的List显示时效率更高
4、RemoteView---搭配PendingIntent使用
网络编程