美文网首页
Android 基本面试题

Android 基本面试题

作者: 城北客运站徐公 | 来源:发表于2019-01-12 11:25 被阅读0次

    Android 基本面试题



    一、java 核心思想

    1、八种基本数据类型和封装类

    基本类型 大小(字节)
    byte 1
    short 2
    int 4
    long 8
    float 4
    double 8
    boolean 1bit
    char 2

    2、 Switch能否用string做参数?

    在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。

    3、设计模式

    工厂方法模式

    interface food{}
    
    class A implements food{}
    class B implements food{}
    class C implements food{}
    
    public class StaticFactory {
    
        private StaticFactory(){}
        
        public static food getA(){  return new A(); }
        public static food getB(){  return new B(); }
        public static food getC(){  return new C(); }
    }
    
    class Client{
        //客户端代码只需要将相应的参数传入即可得到对象
        //用户不需要了解工厂类内部的逻辑。
        public void get(String name){
            food x = null ;
            if ( name.equals("A")) {
                x = StaticFactory.getA();
            }else if ( name.equals("B")){
                x = StaticFactory.getB();
            }else {
                x = StaticFactory.getC();
            }
        }
    }
    

    单例模式

    public class Singleton {
        private Singleton(){}
    
        private static class SingletonBuild{
            private static Singleton value = new Singleton();
        }
    
        public Singleton getInstance(){  return  SingletonBuild.value ;}
        
    }
    

    builder模式

    public class Builder {
    
        static class Student{
            String name = null ;
            int number = -1 ;
            String sex = null ;
            int age = -1 ;
            String school = null ;
    
         //构建器,利用构建器作为参数来构建Student对象
            static class StudentBuilder{
                String name = null ;
                int number = -1 ;
                String sex = null ;
                int age = -1 ;
                String school = null ;
                public StudentBuilder setName(String name) {
                    this.name = name;
                    return  this ;
                }
    
                public StudentBuilder setNumber(int number) {
                    this.number = number;
                    return  this ;
                }
    
                public StudentBuilder setSex(String sex) {
                    this.sex = sex;
                    return  this ;
                }
    
                public StudentBuilder setAge(int age) {
                    this.age = age;
                    return  this ;
                }
    
                public StudentBuilder setSchool(String school) {
                    this.school = school;
                    return  this ;
                }
                public Student build() {
                    return new Student(this);
                }
            }
    
            public Student(StudentBuilder builder){
                this.age = builder.age;
                this.name = builder.name;
                this.number = builder.number;
                this.school = builder.school ;
                this.sex = builder.sex ;
            }
        }
    
        public static void main( String[] args ){
            Student a = new Student.StudentBuilder().setAge(13).setName("LiHua").build();
            Student b = new Student.StudentBuilder().setSchool("sc").setSex("Male").setName("ZhangSan").build();
        }
    }
    

    二、Android 基本知识

    1、自定义view

    View在Activity中显示出来


    ,要经历测量、布局和绘制三个步骤

    (1)测量:onMeasure()决定View的大小;

    (2)布局:onLayout()决定View在ViewGroup中的位置;

    (3)绘制:onDraw()决定绘制这个View。

    自定义View的步骤:

    1. 自定义View的属性;编写attr文件
    2. 在View的构造方法中获得自定义的属性;
    3. 重写onMeasure(); --> 并不是必须的,大部分的时候还需要覆写
    4. 重写onDraw();

    2、Activity的生命周期与启动模式

    生命周期

    image

    启动模式

    (1)standard:标准模式,每次启动一个Activity都会重新建一个新的实例,不管这个实例是否已经存在。

    (2)singleTop:栈顶复用模式,如果新Activity已经位于任务站的栈顶,那么次Activity不会被重新创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去取当前请求的信息。

    (3)singleTask:栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会调用其onNewIntent

    (4)singleIntance:单实例模式,一种加强的singleTask模式,除了具有singleTask模式的所有特性,还具有此种模式的Activity只能单独地位于任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个任务栈被系统销毁

    3、Android中常用的五种布局

    常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

    4、内存优化

    产生原因

    (1)静态变量

    (2)非静态内部类

    (3)Handler ——>弱引用解决

     private static class MyHandler extends Handler {
    
       private WeakReference<MainActivityactivityWeakReference;
    
       public MyHandler(MainActivity activity) {
          activityWeakReference = new WeakReference<>(activity);
       }
        
       @Override
        public void handleMessage(Message msg) {
            MainActivity activity = activityWeakReference.get();
            if (activity != null) {
                if (msg.what == 1) {
                    // 做相应逻辑
                }
            }
        }
    }
    

    5、事件分发机制

    image

    6、Activity启动过程

    当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。

    7、保存Activity状态

    onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用;

    8、Handler的原理

    Android中主线程是不能进行耗时操作的,子线程是不能进行更新UI的。所以就有了handler,它的作用就是实现线程之间的通信。

    handler整个流程中,主要有四个对象,handler,Message,MessageQueue,Looper。当应用创建的时候,就会在主线程中创建handler对象,

    我们通过要传送的消息保存到Message中,handler通过调用sendMessage方法将Message发送到MessageQueue中,Looper对象就会不断的调用loop()方法

    不断的从MessageQueue中取出Message交给handler进行处理。从而实现线程之间的通信。

    相关文章

      网友评论

          本文标题:Android 基本面试题

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