Android基础面试高频问答

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属性动画特性

Android基础面试高频问答_第1张图片
属性动画

修改背景颜色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)

Android基础面试高频问答_第2张图片
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




    

  1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。布局中RelativeLayout的300dp也会失去意义,会自动变成wrap_content
  2. 如果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;
        }
  1. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。既最外层的300dp将会生效,inflate返回的是recycler_view_item.xml
  2. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
    Android LayoutInflater原理分析,带你一步步深入了解View(一)
    View inflate方法和LayoutInflater inflate方法的区别详解

18、invalidate()与postInvalidate()的区别

invalidate():必须在主线程中调用
postInvalidate():可以在线程中调用,其实底层也是用了handlemessage发送消息给主线程进行刷新的

19、Activity-Window-View三者的差别

Android基础面试高频问答_第3张图片

在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基础面试高频问答_第4张图片
Android应用程序窗口模型

Android系统服务 —— WMS与AMS

28 、自定义View如何考虑机型适配

(1)获取屏幕宽度px等数据,然后根据这些去设置 view的宽度px,字体的大小
(2)我们可以把想要显示的大小用dp、sp作为单位,然后在代码中通过工具类转换为px

29、Android长连接,怎么处理心跳机制

Android长连接,怎么处理心跳机制

30、LaunchMode应用场景

android launchMode理解以及应用场景
各LaunchMode的使用场景

你可能感兴趣的:(Android基础面试高频问答)