美文网首页
Android基础面试高频问答

Android基础面试高频问答

作者: 忧零520 | 来源:发表于2019-02-14 10:38 被阅读9次

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方式:

<objectAnimator
        android:valueTo="#f467f5"
        android:duration="2000"
        android:propertyName="backgroundColor"
        />
 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)

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:background="@android:color/holo_green_light"
              android:layout_width="300dp"
              android:layout_height="wrap_content">

    <TextView
        android:id="@+id/index"
        android:text="编号"
        android:background="#cccccc"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:gravity="center"
        android:layout_height="match_parent"/>
</RelativeLayout>
  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三者的差别


在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源码解析

相关文章

网友评论

      本文标题:Android基础面试高频问答

      本文链接:https://www.haomeiwen.com/subject/aivseqtx.html