Android面试,个人总结

作者: 鹅鹅鹅曲项向天歌呀 | 来源:发表于2018-12-04 11:43 被阅读85次

    Java部分:

    一、八种数据类型以及他们的包装类

    int long float double byte short char boolean
    Integer Long Float Double Byte Short Character Boolean
    -2^31 ~ 2^31-1 2^63 ~ 2^63-1 -128~127 -32768~32767 0~65535 true/false

    二、abstract与interface的区别(抽象类和接口)

        1、关键字:抽象类 abstract         接口interface
        2、抽象类继承 extends             接口实现 implements
        3、子类继承抽象类和                实现类实现接口的格式不同
        4、抽象类中有各种属性和方法         接口中只有全局变量和抽象方法
        5、抽象类只能单继承                接口可以多实现
        6、抽象类的子类只能继承一个父类      实现类可以实现多个接口,并且还可以继承父类
        7、抽象类的作用:提高代码的复用性    接口的作用:1、规范代码2、提高代码的拓展新
    

    三、重写和重载的区别

        1、重写是在继承关系中                   重载是在同一个类中
        2、重写是方法名、参数列表和父类相同       重载,方法名相同,参数列表不相同(个数、类型、顺序)
        3、重写返回值类型和父类相同              重载和返回值无关
        4、重写访问权限修饰符不能比父类更加严格    重载没有要求
    

    四、return和break和continue的区别

    1.break语句的使用场合主要是switch语句和循环结构。
    在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。
    如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构

    break效果图.jpg

    2.continue:终止当前的一次循环过程,但是不跳出循环,而是继续往下执行下一次循环。


    continue实例

    3.return:如果在程序中遇到return语句,那么代码就退出该函数的执行,返回到函数的调用处

    return效果图.jpg

    五、面向对象和面向过程

    面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
    面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

    面向对象三个特征:
    封装,继承,多态
    封装:
    封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。get()/set()方法
    继承:
    子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为
    这个很好理解,解析数据的时候,大家应该都有一个BaseBean,然后去继承他,不用重复写代码,利于代码的复用性
    多态:
    多态是指父对象中的同一个行为能在其多个子对象中有不同的表现。
    也就是说子对象可以使用重写父对象中的行为,使其拥有不同于父对象和其它子对象的表现,这就是overriding(重写)
    多态存在的三个必要条件:
    一、要有继承;
    二、要有重写;
    三、父类引用指向子类对象

    多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

    六、equals()和==的区别

    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,
    即是否是指相同一个对象。比较的是真正意义上的指针操作。
    equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,
    所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,
    而Object中的equals方法返回的却是==的判断。

    七、大路边的几个设计模式

    工厂模式:
    android中的demo体现:线程池
    https://blog.csdn.net/nugongahou110/article/details/50425823
    这个链接,very good,对我来说,非常好理解,what is 工厂模式???我是在这儿学的,原谅我这个菜鸟吧,不会总结.
    最好把demo敲一遍,加深记忆,很好理解,虽然看也是可以看懂的.
    建造者模式:
    https://blog.csdn.net/nugongahou110/article/details/50395698
    android中,大概build()结尾的都是吧.比如:Imagrloder,AlertDialog.Builder等等.
    装饰者模式:
    https://blog.csdn.net/nugongahou110/article/details/50413668

    单例模式:
    饿汉式:

    //只有内部类可以为static。
    public class SingIn{
        //在自己内部定义自己的一个实例,只供内部调用
        private static final SingIn instance = new SingIn();
        private SingIn(){
        }
        //这里提供了一个供外部访问本class的静态方法,可以直接访问
        public static SingIn getInstance(){
            return instance;
        }
    }
    

    懒汉式:

    /***
         * 一种常用的形式
         */
        private static SingIn instance = null; 
        public static synchronized SingIn getInstance() {         
          // 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次  
          // 使用时生成实例,提高了效率!  
           if (instance == null)  
                  instance = new SingIn();  
                  return instance;  
        }
    

    双重锁定:(这个一般在实际应用中用的比较多,以上,了解即可)

    //将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。 
    private static volatile SingIn instance=null;
     private SingIn (){
     
     }
     public static  SingIn getInstance(){
        if(instance==null){
          synchronized(SingIn .class){
          if(instance==null){
            instance=new SingIn ();
           }
          }
         }
        return instance;
      }
    

    九、String,StringBuffer,StringBuilder

    关系图

    1、运行速度:StringBuilder > StringBuffer > String

    原因: String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,每一次新的赋值,都会重新创建对象,垃圾回收机制回收旧的对象,但后两者的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
    2、线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的
     原因:StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

    十、正则表达式

    Pattern 类:
    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
    Matcher 类:
    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
    PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

    十一、集合

    整体关系图

    十二、I/O

    I/O

    十三、线程

    线程的生命周期
    新建状态:
    使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
    就绪状态:
    当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
    运行状态:
    如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
    阻塞状态:
    如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。
    在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
    等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
    同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
    其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。
    当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
    死亡状态:
    一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
    Java 提供了三种创建线程的方法:
       通过实现 Runnable 接口;
       通过继承 Thread 类本身;
       通过 Callable 和 Future 创建线程。
    进程和线程的区别:
    进程是应用程序,线程是一条执行路径
    进程有独立的内存空间,崩溃不会影响其他程序,
    线程没有独立的空间,多个线程在同一个进程的空间,可能会影响其他线程
    一个进程中,至少有一个线程
    run和start的区别
    run没有开辟新的栈空间,没有新线程,都是主线程在执行
    start开辟了新的栈空间,在新的栈空间启动run()方法
    sleep和pield的区别:
    sleep 线程进入被阻塞的状态
    yeild 线程转入暂停执行的状态
    打断线程的终止方式
    1、用标记,当终止线程时,会执行完run方法
    2、stop()方法,不建议使用,会执行不到特定的代码
    3、interrupt(),只能中断正在休眠的线程,通过抛异常的方法中断线程的终止。
    InputStream inputStream=System.in;
    int m=inputStream.read();
    myThread2.interrupt();//通过外界输入打断

    十四、数据库

                Class.forName("com.mysql.jdbc.Driver");
            
                // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL,USER,PASS);
            
                // 执行查询
                System.out.println(" 实例化Statement对象...");
                stmt = conn.createStatement();
                String sql;
                sql = "SELECT id, name, url FROM websites";
                ResultSet rs = stmt.executeQuery(sql);
            
                // 展开结果集数据库
                while(rs.next()){
                    // 通过字段检索
                    int id  = rs.getInt("id");
                    String name = rs.getString("name");
                    String url = rs.getString("url");
        
                    // 输出数据
                    System.out.print("ID: " + id);
                    System.out.print(", 站点名称: " + name);
                    System.out.print(", 站点 URL: " + url);
                    System.out.print("\n");
                }
                // 完成后关闭
                rs.close();
                stmt.close();
                conn.close();
    

    十五、网络

    一、HttpClient:
    HttpClient 是Apache的一个三方网络框架,网络请求做了完善的封装,api众多,用起来比较方便,开发快。实现比较稳定,bug比较少,但是正式由于其api众多,是我们很难再不破坏兼容性的情况下对其进行扩展。所以,Android团队对提升和优化httpclient积极性并不高。android5.0被废弃,6.0逐渐删除。
    二、HttpURLConnection
    HttpURLConnection是一个多用途、轻量级的http客户端。它对网络请求的封装没有HttpClient彻底,api比较简单,用起来没有那么方便。但是正是由于此,使得我们能更容易的扩展和优化的HttpURLConnection。不过,再android2.2之前一直存在着一些令人烦的bug,比如一个人可读的inputstream调用它的close方法的时候,会使得连接池实效,通常的做法就是禁用连接池。因此,在android2.2之前建议使用稳定的HttpClient,android2.2之后使用更容易扩展和优化的HttpURLConnection。
    三、okhttp
    支持Android 2.3及其以上版本;
    支持Java JDK 1.7以上版本;
    okhttp是专注于提升网络连接效率的http客户端。
    1、它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力。
    2、okhttp 对http和https都有良好的支持。
    3、okhttp 不用担心android版本变换的困扰。
    4、成熟的网络请求解决方案,比HttpURLConnection更好用。
    4、缺点,okhttp请求网络切换回来是在线程里面的,不是在主线程,不能直接刷新UI,需要我们手动处理。封装比较麻烦。

    十六、json和html

    XML的三种原生解析方式
    DOM,SAX,PULL
    DOM:内存消耗大 但是便于遍历.打开文档,将其转化为节点树,然后在其用循环的方式,遍历节点,一一查找.
    SAX:速度快,战内存少.但是文件结构信息会丢失,采用的是流的处理方式.从起始标签开始一一往下逐个查找.起始标签与结尾标签作为标记来将一组数据存入一个集合中,想水流一样一直到最尾,然后最后返回集合,集合中就存下了所有的数据(这也应该就是所谓的流处理方式吧).
    PULL:是Android内置,推荐的一种,相对来说有点类似SAX,也是从上往下,但是它还是已文档开始与结尾为条件,在其中间进行查找处理,然后分为不同标签开始逐一查找.
    JSON的三种解析方式
    原始解析:JSONObject
    google的Gson: Gson gson = new Gson();
        String str = gson.toJson(obj);
    阿里的Fastjson:
        JSON.parseObject(result,MenuBean.class);



    Android部分

    1、MVC、MVP、MVVM

    推荐链接:
    http://blog.csdn.net/hudan2714/article/details/50990359

    MVC

    模型(model)-视图(view)-控制器(controller)

    MVC.png
    数据关系:
    View 接受用户交互请求
    View 将请求转交给Controller
    Controller 操作Model进行数据更新
    数据更新之后,Model通知View更新数据变化
    View 更新变化数据
    使用:
    MVC中的View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

    MVP

    Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理

    MVP.png
    数据关系:
    View 接收用户交互请求
    View 将请求转交给 Presenter
    Presenter 操作Model进行数据更新
    Model 通知Presenter数据发生变化
    Presenter 更新View数据
    使用:
    MVP的实现会根据View的实现而有一些不同,一部分倾向于在View中放置简单的逻辑,在Presenter放置复杂的逻辑;另一部分倾向于在presenter中放置全部的逻辑。这两种分别被称为:Passive View和Superivising Controller。

    MVVM

    Model-View-ViewModel


    MVVM.png

    数据关系:
    View 接收用户交互请求
    View 将请求转交给ViewModel
    ViewModel 操作Model数据更新
    Model 更新完数据,通知ViewModel数据发生变化
    ViewModel 更新View数据
    使用:
    可以兼容你当下使用的 MVC/MVP 框架。
    增加你的应用的可测试性。
    配合一个绑定机制效果最好。

    2、四大组件

    Activity、BroadcastReceiver、Service、ContentProvider

    Activity:(活动)

    生命周期:
    onCreate():每个活动都会重写这份方法,他会在活动第一次创建的时间被调用,可完成初始化操作,加载布局,绑定事件。
    onStart():不可见变成可见的时候调用。
    onResum():这个方法是在活动准备好和用户进行交互的时候调用。
    onPause():这个方法是系统准备去启动或者回复另一个活动的时候调用,用户不可见,这里需要保存一些关键数据。
    onStop():这个方法在活动完全不可见的时间调用,被下一个activity覆盖。和onPause()的区别就是,若启动的新活动是个对话框,onPause会执行,onStop不会执行.
    onDestory():这个在活动被销毁钱调用,之后变成销毁状态。
    onRestart():这个方法在活动停止状态变成运行状态之前调用.onRestart->inStart->onResum
    启动模式:
    standard:默认启动方式,每次启动都会创建一个新的活动。A启动A,启动一次创建一个。
    singleTop:在启动界面时,如果发现该活动位于栈顶,则不会创建新的活动,直接使用它。A启动A,只会创建一个A。当A不位于栈顶时,启动A,则会创建新的A。
    singleTask:每次启动活动时,系统首次会在栈中检查是否存在该活动的实例,如果发现已存在,则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果发现没有,则创建新的活动实例。A启动B,B在启动A,B销毁(onDestory()),A重新位于栈顶(onRestart())。
    singleInstance:启动一个新的栈来管理活动。进程间的通讯,别的程序和我们的程序可以共享这个活动。

    BroadcastReceiver:(广播)

    注册广播的两种方式:
    静态注册:
    我们需要生成一个类去继承BroadcastReceiver,并复写onReceiver()方法,并且在清单文件中注册Receiver,在<intent-filter>标签中定义action唯一标识属性。
    动态注册:
    新建一个类继承BroadcastReceiver,重写onReceiver()方法.然后再Activity当中复写onStart()和onStop()方法,在onStart()当中,我们需要构造一个IntentFilter对象,并执行这个对象的addAction方法,参数为action标识符,再执行registerReceiver()方法,参数为广播接收器对象和IntentFilter对象。在onStop()中执行unregisterReceiver()方法,参数为广播接收器对象。
    发送广播:
    无序广播:
    sendBroadcast()
    有序广播:
    sendOrderedBroadcast()
    本地广播:
    LocalBroadcastManager来管理广播
    注意:
    1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
    2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
    3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
    4.耗时的较长的工作最好放在服务中完成

    ContentProvider:(内容提供器)

    跨程序共享数据功能
    访问其他程序:ContentResolver,增删改查,读取联系人功能
    创建自己的内容提供器供其他程序使用。继承ContentProvider
    清单文件必须注册才能使用

    Service(服务)

    清单文件必须注册才能使用
    1.Context.startService()
    onCreate() -> onStartCommand() -> onDestroy()
    onCreate()该方法在服务被创建时调用,该方法只会被调用一次
    onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStartCommand () 方法会被多次调用。
    onDestroy()该方法在服务被终止时调用。
    2、Context.bindService()
    onCreate() -> onBind() -> onUnbind() -> onDestroy()
    onCreate()该方法在服务被创建时调用,该方法只会被调用一次
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法,onBind()方法并不会导致被多次调用。
    onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
    onDestroy()该方法在服务被终止时调用。
    注意:
    如果先采用startService()方法启动服务,又调用bindService()方法绑定到服务,必须同时调用stopService()和unbindSetvice(),服务才能停掉。
    Service和IntentService的区别是什么?
    1.Service在默认情况下将会运行在主线程当中
    2.IntentService在收到请求后,将会执行onHandlerIntent方法,该方法运行在workerThread当中
    3.Service和IntentService的第二项区别是当Intent收到多次请求时,这些请求将会在消息队列当中排队,依次由onHandlerIntent处理

    3、Android的数据存储方式--持久化技术

    文件存储、SharedPreference存储、数据库存储
    文件存储
    存储简单的文本或者二进制数据,流的方式存储
    openFileOutput()
    openFileInput()
    SharedPreference
    键值对的方式存储
    三种方法获取SharedPreference对象
    1.Context类中的getSharedPreference()方法
    2.Activity类中的getPreference()方法
    3.PreferenceManager类中的getSharedPreference()方法
    数据库存储
    复杂的数据
    SQLite
    SQLiteOpenHelper

    4、异步消息处理机制--Message、Handler、MessageQueue、Lopper

    1.在主线程,创建handler对象.
    2.在子线程,数据封装在Message对象中,handler执行发送的动作(发送到handler所在的主线程)
    3.在主线程,message对象发送到messagequeue()中,looper调用loop()方法不断监听消息队列,如果有数据,则取出,调用handler和dispatchmessage()方法将消息分发带指定handler中.
    4.在主线程,dispatchmessage()方法中,将接收到的message对象交给handlemessage()方法处理.
    5.重写handlermeaage()方法,做出实际的动作处理.

    5、XML和JSON格式数据解析

    XML
    Pull
    Sax
    Dom
    JSON
    Fastjson(阿里)
    Gson(谷歌)
    jackson(SpringMVC自带)

    6、Intent和PendingIntent的区别

    Intent:立即执行某个动作
    PendingIntent:在某个合适的时机去执行某个动作,延迟执行的intent

    7、三种动画

    Drawable Animation(帧动画)
    主要涉及类:AnimationDrawable
    1、通过 XML 文件实现

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list 
        android:oneshot="true"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/a_0"
            android:duration="100" />
        <item
            android:drawable="@drawable/a_1"
            android:duration="100" />
        <item
            android:drawable="@drawable/a_2"
            android:duration="100" />
    </animation-list>
    

    java代码开启:

    ImageView imageview = (ImageView) findViewById(R.id.imageview);
    imageview.setImageResource(R.drawable.xml_name);
    AnimationDrawable animationDrawable = (AnimationDrawable) imageview.getDrawable();
    animationDrawable.start();//animationDrawable.stop();
    

    2、只通过 Java 代码实现

    AnimationDrawable animationDrawable = new AnimationDrawable();
    int[] mipmaps = new int[]{R.drawable.a_0,R.drawable.a_1,R.drawable.a_2};
    for (int i = 0; i < 3; i++) {
        int id=mipmaps[i];
        //或者使用下面方式,注意如果图片资源放在mipmap下时将drawable修改下
        //int id = getResources().getIdentifier("a_" + i, "drawable",getPackageName());
        Drawable drawable = getResources().getDrawable(id);
        animationDrawable.addFrame(drawable, 200);
    }
    animationDrawable.setOneShot(false);
    imageView.setBackgroundDrawable(animationDrawable);
    animationDrawable.start();
    

    View Animation(补间动画)使用详解

    roperty Animation(属性动画)

    8、Design的使用

    9、Fragment的生命周期

    onAttach() fragment已经关联到activity
    onCreate() 系统创建fragment的时候回调他,在他里面实例化一些变量
    onCreateView() 第一次使用的时候 fragment会在这上面画一个layout出来 onActivityCreated() 当Activity中的onCreate方法执行完后调用。
    onStart() 和activity一致 启动, Fragement 启动时回调, 此时Fragement可见;
    onResume() 和activity一致 在activity中运行是可见的
    onPause() 和activity一致 其他的activity获得焦点,这个仍然可见
    onStop()和activity一致fragment不可见的,
    onDestroyView() Fragment中的布局被移除时调用。
    onDestroy() 销毁fragment对象
    onDetach() Fragment和Activity解除关联的时候调用。

    10、清单文件里面的内容包括哪些?

    应用程序的包名,该包名作为该应用的唯一标识。
    应用包含的组件,如Activity,Service,Broadcastreceiver和ContentProvider.
    应用程序使用系统所需的权限声明。
    其他程序访问该程序所需的权限声明。

    11、如何兼容不同的版本

    在使用高于minSdkVersion API level的方法需要:
    @TargeApi($API_LEVEL)使可以编译通过, 不建议使用@SuppressLint("NewApi");
    运行时判断API level; 仅在足够高,有此方法的API level系统中,调用此方法;
    保证功能完整性,保证低API版本通过其他方法提供功能实现。

    12、如何配置第三方的sdk

    13、fragment的切换方式

    如果用replace()就会每次都初始化Fragment
    正确的切换方式是add(),切换时hide()add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。
    这样就能做到多个Fragment切换不重新实例化

    14、点击事件的分发机制

    首先会手势在屏幕上传递事件,会先走到最外层的布局的dispatchTouchEvent--》然后通过onInterceptTouchEvent的返回值,判断是否拦截,
    如果拦截,就不走子视图当中的事件响应了,而执行自己的onTouchEvent方法,
    如果不拦截,就会走子视图dispatchTouchEvent--onTouch--onTouchEvent方法,如果onTouchEvent的返回值为true,那么这个事件此子视图负责消费,否则就会回传到上一视图的onTouchEvent当中来处理,
    如果上一视图返回为true,则其消费,否则事件回收不做处理。
    onTouchListener当中的onTouch方法里,判断返回值,然后决定是否执行onTouchEvent方法,然后在onTouchEvent方法的ACTION_DOWN操作中通过判断时间和标志位,决定是否执行onLongClickListener当中onLongClick操作,然后在onLongClick方法中通过判断返回值,来确定onClickListeneronClick方法是否会执行,如果返回false,都能执行,如果返回trueonClick不执行。

    15、消息推送原理以及实现过程

    客户端和服务器一直保持长链接
    推荐链接:https://www.jianshu.com/p/da4529fd4675

    16、map集合的存储原理

    通过键值对的方式进行存取数据的

    17、计步器的实现原理(思路)

    18、js交互,不在后台的参与下,如何获取用户信息?

    19、自定义View的只要重写的方法名有哪些?

    有三个构造方法(一个参数、两个参数、三个参数),其中两个参数的构造方法必须有。
    onDraw()方法必须有,是用来绘制View图像的
    如果要改变View 的大小,需要重写onMeasure()方法。
    如果要改变View在父控件中的位置,需要重写onLayout()方法

    20、Alipay的支付流程?

    支付宝支付流程.png

    21、怎么让viewpager不滑动?

    大致就是重写ViewPager,覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0)方法,这两个方法的返回值都是boolean类型的,只需要将返回值改为false,那么ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。

    22、如何避免内存泄露(造成内存泄漏的原因)?

    资源对象没关闭造成的内存泄漏,如查询数据库后没有关闭游标cursor
    构造Adapter时,没有使用 convertView 重用
    Bitmap对象不在使用时调用recycle()释放内存

    23、下拉刷新的实现?

    1.原生的SwipeRefreshLayout
    设置监听,写onRefresh()方法,然后设置setrefreshing(true),刷新完之后设置成false.
    2.第三方框架. PullToRefresh.
    在布局文件中添加PullToRefresh控件,比如PullToRefreshListView; 在Activity中,设置监听器OnRefreshListener以响应用户下拉操作; 在监听器的onRefresh()方法中执行数据刷新操作,可以通过AsyncTask来实现; 在AsyncTask中获取到数据后,记得调用onRefreshComplete()方法通知PullToRefresh控件数据已获取完毕,可以结束刷新操作。

    24、侧滑菜单的实现?(抽屉效果)

    1.DrawerLayout.
    第一个控件是主题内容,第二个控件是侧滑菜单内容.
    与toolbar连用,使用开关.ActionBarDraweerTohhle.
    2.SlidingPaneLayout
    第一个控件为左侧侧滑菜单,第二个为主题内容
    Toolbar和SlidingPaneLayout不能够直接相互配合使用,要通过actionbar和slidingpaneLayout的监听事件才能联动起来

    25、java虚拟机jvm和android虚拟机Dalvik的区别?

    java虚拟机:
    java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)
    android虚拟机:
    Dalvik运行的是自定义的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据)

    26、Java当中的加密解密技术?

    1、md5加密,该加密算法是单向加密,即加密的数据不能再通过解密还原。保证数据的完整性.相关类包含在java.security.MessageDigest包中。
    2、DES加密,该加密算法是可逆的,解密方可以通过与加密方约定的密钥匙进行解密。相关类包含在javax.crypto.*包中。
    3、base64编码,是用于传输8bit字节代码最常用的编码方式。相关类在sun.misc.BASE64Decoder 和sun.misc.BASE64Encoder 中。
    4、URLEncoder编码,是一种字符编码,保证被传送的参数由遵循规范的文本组成。相关类在java.net.URLEncoder包中。
    5.RSA. 公钥加密,私钥加密.互为加解密,自己不可以解密
    非对称加密
    6. Sign:摘要算法+不对称加密算法
    保证数据的安全性,用对方的公钥加密,发送成功后,用对方的私钥解密

    27、屏幕适配的方法

    屏幕适配.png
    推荐文章:https://blog.csdn.net/wangwangli6/article/details/63258270/

    28、图片的三级缓存

    内存缓存,优先加载,速度最快
    本地缓存,次优先加载,速度快
    网络加载,不优先加载,速度慢,浪费流量
    原理:

    图片缓存流程.png
    推荐链接:https://www.jianshu.com/p/2cd59a79ed4a

    30、适配全面屏

    1、App AndroidManifest的Application标签下面增加下面一段代码:
    <meta-data android:name="android.max_aspect" android:value="2.1" />
    2、更换部分被拉伸的图片资源文件(相对布局采用XML的方式,或者.9图的解决方案)
    3、布局文件的优化建议(使用百分比布局)

    相关文章

      网友评论

        本文标题:Android面试,个人总结

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