1、横竖屏切换的时候,Activity 各种情况下的生命周期
Activity横竖屏切换生命周期变化
你应该知道的Activity状态的保存与恢复
2、Activity上有Dialog的时候按Home键时的生命周期
和正常情况一样,有无Diaolg没有区别
Activity上有Dialog的时候按Home键时的生命周期
3、Activity四种启动模式对比
Activity四种启动模式对比
onNewIntent调用时机
4,彻底搞懂startActivityForResult在FragmentActivity和Fragment中的异同
(1)使用startActivityForResult的时候,requestCode一定不要大于0xffff(65535)。
(2)如果希望在Fragment的onActivityResult接收数据,就要调用Fragment.startActivityForResult,而不是Fragment.getActivity().startActivityForResult。
彻底搞懂startActivityForResult在FragmentActivity和Fragment中的异同
5、ViewPager要这样用才显出你的气质
一些骚气的滑动效果
ViewPager要这样用才显出你的气质
从 0 开始开发一款直播 APP
6、fragment之间传递数据的方式
android fragment传递参数_fragment之间传值的两种方法
Fragment之间传递数据的三种方式
Android Fragment 的使用,一些你不可不知的注意事项
7、如何将service与activity绑定
如何将service与activity绑定
8、Activity和Service的交互方式
Activity和Service的交互方式
9、广播的种类
广播的种类
BroadcastReceiver"-安卓面试必问技能点大总结
10、本地广播
Android高效安全的本地广播LocalBroadcast完全解析
11、Android AlertDialog和PopupWindow使用和区别
Android AlertDialog和PopupWindow使用和区别
PopupWindow弹出后其他地方变暗的效果如何实现
12、Application 和 Activity 的 Context 对象的区别
Android Application中的Context和Activity中的Context的异同
13、Android属性动画特性
修改背景颜色XML方式:
AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(AnimatorActivity.this,R.animator.view_animator_set);
animatorSet.setTarget(objectView);
animatorSet.start();
//其中,setTarget后,animator会自动调用setBackgroundColor方法,从而修改它的值
Android 属性动画:这是一篇很详细的 属性动画 总结&攻略
Android Animation学习(三) ApiDemos解析:XML动画文件的使用
14、帧动画
逐帧动画
15、补间动画(Tween)
Animation animation = new RotateAnimation(0,100 ,mView.getWidth() * 0.5f, mView.getHeight() * 0.5f);
animation.setFillAfter(true);
animation.setDuration(1000);
animation.setRepeatCount(3);
animation.setInterpolator(new AccelerateDecelerateInterpolator());
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.i(TAG,"onAnimationStart");
}
@Override
public void onAnimationEnd(Animation animation) {
Log.i(TAG,"onAnimationEnd");
}
@Override
public void onAnimationRepeat(Animation animation) {
Log.i(TAG,"onAnimationRepeat");
}
});
mView.startAnimation(animation);
16、序列化的作用,以及Android两种序列化的区别
(1)虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
(2)Java应用程序中有Serializable来实现序列化操作,Android中有Parcelable来实现序列化操作,相关的性能也作出了比较,因此在Android中除了对数据持久化的时候需要使用到Serializable来实现序列化操作,其他的时候我们仍然需要使用Parcelable来实现序列化操作,因为在Android中效率并不是最重要的,而是内存,通过比较Parcelable在效率和内存上都要优秀与Serializable,尽管Parcelable实现起来比较复杂,但是如果我们想要成为一名优秀的Android软件工程师,那么我们就需要勤快一些去实现Parcelable,而不是偷懒与实现Serializable.当然实现后者也不是不行,关键在于我们头脑中的那一份思想
Android中Serializable和Parcelable序列化对象详解
17、inflate(int resource, ViewGroup root, boolean attachToRoot)的使用
recycler_view_item.xml
- 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。布局中RelativeLayout的300dp也会失去意义,会自动变成wrap_content
- 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。这个时候布局中RelativeLayout的300dp会产生效果。并且inflate将会做两步操作,一个把recycler_view_item.xml添加到root中,再返回root
注意:在recycleView中加载itemView时不能设置为true,因为接下来创建ViewHolder需要的是itemView的布局,而不是整个RecyclerView,创建ViewHolder时,它不希望itemView有父布局
public final VH createViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerView.ViewHolder var4;
try {
TraceCompat.beginSection("RV CreateView");
VH holder = this.onCreateViewHolder(parent, viewType);
if (holder.itemView.getParent() != null) {
throw new IllegalStateException("ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot)");
}
holder.mItemViewType = viewType;
var4 = holder;
} finally {
TraceCompat.endSection();
}
return var4;
}
- 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。既最外层的300dp将会生效,inflate返回的是recycler_view_item.xml
- 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
Android LayoutInflater原理分析,带你一步步深入了解View(一)
View inflate方法和LayoutInflater inflate方法的区别详解
18、invalidate()与postInvalidate()的区别
invalidate():必须在主线程中调用
postInvalidate():可以在线程中调用,其实底层也是用了handlemessage发送消息给主线程进行刷新的
19、Activity-Window-View三者的差别
在Activity中调用attach,创建了一个Window
创建的window是其子类PhoneWindow,在attach中创建PhoneWindow
在Activity中调用setContentView(R.layout.xxx)
其中实际上是调用的getWindow().setContentView()
调用PhoneWindow中的setContentView方法
创建ParentView:作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)
将指定的R.layout.xxx进行填充通过布局填充器进行填充【其中的parent指的就是DecorView】
调用到ViewGroup
调用ViewGroup的removeAllView(),先将所有的view移除掉
添加新的view:addView()
Activity-Window-View三者的关系
20、谈谈对Volley的理解
Volley在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient
虽然从Android4.4开始HttpURLConnection的底层实现采用的是okHttp了,但是由于系统版本的不同,导致底层的okhttp源码不统一和老旧,所以我们可以把最新的okhttp加入到Volley中。集成教程: Android volley 使用OkHttp3.0
注意:封装过程中需要导入httpcore.jar
由于okhttp3中使用了 lambda 表达式,所以得用jdk8或者以上
//okhttp中
// 错误: -source 1.7 中不支持 lambda 表达式
// (请使用 -source 8 或更高版本以启用 lambda 表达式)
//指定jdk版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Android Volley完全解析
21、描述一次网络请求的流程
NetWork——描述一次完整的网络请求过程
NetWork——关于TCP协议的三次握手和四次挥手
22、HttpUrlConnection 和 okhttp关系和okhttp的使用
Android 网络(三) HttpURLConnection OkHttp
Okhttp使用详解
OKHttp源码解析
23、Bitmap对象的理解
Bitmap的深入理解
Bitmap和Drawable
各个击破搞明白PorterDuff.Mode花式制作圆角按钮
注意:制作目标图片是需要使用Bitmap.Config.ARGB_8888,制作带有透明度的图片,否则无效
//由于画的是圆角图片,那么有的部分需要透明度把它隐藏掉,所以必须是ARGB_8888而不能是565
Bitmap out = Bitmap.createBitmap(destWidth,destWidth, Bitmap.Config.ARGB_8888);
24、 Retrofit 2.0 使用
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
25、RxJava的使用
RxJava系列教程,作者总结得很详细
26、Android消息处理机制(Handler、Looper、MessageQueue与Message
Android消息处理机制(Handler、Looper、MessageQueue与Message)
27、ActivityThread,AMS,WMS的工作原理
Activity与WIndow:
Activity只负责生命周期和事件处理
Window只控制视图
一个Activity包含一个Window,如果Activity没有Window,那就相当于Service
AMS与WMS:
AMS统一调度所有应用程序的Activity
WMS控制所有Window的显示与隐藏以及要显示的位置
Android系统服务 —— WMS与AMS
28 、自定义View如何考虑机型适配
(1)获取屏幕宽度px等数据,然后根据这些去设置 view的宽度px,字体的大小
(2)我们可以把想要显示的大小用dp、sp作为单位,然后在代码中通过工具类转换为px
29、Android长连接,怎么处理心跳机制
Android长连接,怎么处理心跳机制
30、LaunchMode应用场景
android launchMode理解以及应用场景
各LaunchMode的使用场景