Android & Java面试详细个人总结

文导读|   点击标题阅读

互联网寒冬下,程序员如何突围提升自己?

让前端和Android开发者失业的技术:Flutter Web初体验

程序员吐槽:在阿里工作带来光环,在京东却带来负面影响!

转自:https://www.jianshu.com/p/e4ddc1686220

Java部分

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

640?wx_fmt=jpeg

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

三、重写和重载的区别

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

四、return和break和continue的区别

1.break语句的使用场合主要是switch语句和循环结构。

在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。

如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构

640?wx_fmt=jpeg
break效果图

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

640?wx_fmt=jpeg
continue实例

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

640?wx_fmt=jpeg
return效果图

五、面向对象和面向过程

面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了

面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

面向对象三个特征:

封装,继承,多态
封装:
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。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

640?wx_fmt=jpeg
关系图

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 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

十一、集合

640?wx_fmt=gif
整体关系图

十二、I/O

640?wx_fmt=jpeg
I/O

十三、线程

640?wx_fmt=jpeg
线程的生命周期

新建状态:

使用 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)

640?wx_fmt=jpeg
MVC

数据关系:

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负责逻辑的处理

640?wx_fmt=jpeg
MVP

数据关系:
View 接收用户交互请求
View 将请求转交给 Presenter
Presenter 操作Model进行数据更新
Model 通知Presenter数据发生变化
Presenter 更新View数据

使用:
MVP的实现会根据View的实现而有一些不同,一部分倾向于在View中放置简单的逻辑,在Presenter放置复杂的逻辑;另一部分倾向于在presenter中放置全部的逻辑。这两种分别被称为:Passive View和Superivising Controller。

MVVM

Model-View-ViewModel

640?wx_fmt=jpeg
MVVM

数据关系:
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,在标签中定义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(补间动画)使用详解
  补间动画,主要是向View对象设置动画效果,包括AlphaAnimation 、RotateAnimation 、ScaleAnimation 、TranslateAnimation 这4种效果,对应的xml标签分别是alpha、rotate、scale、translate。通过为动画设置初始和终止对应的值,根据插值器和duration计算动画过程中间相应的值实现平滑运动,即设置初始和终止状态,插值器来计算填补初始状态到终止状态间的动画。
使用:
1、设置相应动画效果的起点值、终点值、duration(时长)、Interpolator(加速度)。(注:RotateAnimation还需要设置旋转中心坐标值)
2.Interpolator:插值器,随时间流逝动画路程所应走过的百分比。比如,若设置为LinearInterpolator(匀速),时间过一半则插值器的值是0.5;若设置的是DecelerateInterpolator(加速插值器),时间过一半则插值器的值大于0.5.
实现的方式:(例子,只举例子AlphaAnimation .其它三个,一模一样)
1、通过XML定义

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0"
    android:toAlpha="1"
    android:duration="2000">

    <!--
    fromAlpha 起始透明度 0为完全透明 1为不透明 0~1之间的浮点值
    toAlpha 结束透明度
    duration 动画运行时间 单位毫秒
    -->

</alpha>

Java代码调用:

        AlphaAnimation alphaAnimation=null;
        alphaAnimation= (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_alpha);  //加载XML中的动画XML文件
        //常用属性设置  各种动画通用
        alphaAnimation.setRepeatCount(3);//执行动画效果结束后重复执行3次  一共4次
        alphaAnimation.setRepeatMode(Animation.REVERSE);//重复模式
        alphaAnimation.setFillAfter(true);     //动画结束是否停止在最后一帧
        alphaAnimation.setFillBefore(false);    //动画结束是否停止在第一帧
        //设置插值器 动画执行速度  变速 加减速。。
        //AccelerateInterpolator减速
        //DecelerateInterpolator加速
        //LinearInterpolator匀速
        alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
        button.startAnimation(alphaAnimation);  //将动画设置给button

2、只使用Java代码调用

//在代码中定义 动画实例对象
 Animation myAnimation_Alpha=new AlphaAnimation(0.1f1.0f);//根据各自的构造方法来初始化一个实例对象
 myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒
 myAnimation_Alpha.set.....  //设置各种属性....
button.startAnimation(myAnimation_Alpha);  //将动画设置给button

roperty Animation(属性动画)
  咳咳.这个动画就太强大了,哀家实力有限,又要放大招了,那就是看别人的,哈哈哈哈~~~
  属性动画可以对任何对象的属性做动画而不仅仅是View,甚至可以没有对象。除了作用对象进行扩展外,属性动画的效果也加强了,不仅能实现View动画的4中效果,还能实现其它多种效果,这些效果都是通过ValuAnimator或ObjectAnimator、AnimatorSet等来实现的。
  ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。
  ObjectAnimator :对象动画执行类。继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,不需要设置监听,底层自动完成,一般会用ObjectAnimator来改变某一对象的某一属性.
  实现的方式:
  1、xml

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:valueFrom="0"
    android:valueTo="300"
    android:valueType="intType"
    android:interpolator="@android:interpolator/overshoot">

    <!--
        valueFrom  起始值
        valueTo    结束值
        valueType  值的类型
        intType整数值、floatType浮点值、colorType颜色值
        interpolator插值器
    -->

java代码调用:

ValueAnimator valueAnimator=null;
        //通过AnimatorInflater.loadAnimator()加载xml 创建ValueAnimator
        valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value);
        //动画执行时间
        valueAnimator.setDuration(3000);
        //值改变监听
        valueAnimator.addUpdateListener(listener);
        //开始动画
        valueAnimator.start();
  ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation
{
       //获取值
            int value= (int) animation.getAnimatedValue();
       //btnValueAnimator为测试控件
        //设置控件X轴平移
        btnValueAnimator.setTranslationX(value);
        }
    };
</animator>

2、Java代码

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(button,"scaleX",0.5f);//这个构造方法有很多参数,实现各种动画,还可以组合起来
               objectAnimator.setDuration(3000);
               objectAnimator.setStartDelay(1000);
               objectAnimator.start();

8、Design的使用

Design控件:Toolbar、CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout、TabLayout、TextInputLayout、NavigationView、FloatingActionButton、Snackbar。
推荐学习链接:https://blog.csdn.net/lavor_zl/article/details/51295364

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

1、依赖注入
2、导入moudle

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、自定义View的只要重写的方法名有哪些?

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

18、Alipay的支付流程?

640?wx_fmt=jpeg
支付宝支付流程

19、怎么让viewpager不滑动?

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

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

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

21、下拉刷新的实现?

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

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

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

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

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

24、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:摘要算法+不对称加密算法
保证数据的安全性,用对方的公钥加密,发送成功后,用对方的私钥解密

25、屏幕适配的方法

640?wx_fmt=jpeg
屏幕适配

推荐文章:https://blog.csdn.net/wangwangli6/article/details/63258270/

26、图片的三级缓存

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

原理:

640?wx_fmt=jpeg
图片缓存流程

推荐链接:https://www.jianshu.com/p/2cd59a79ed4a

27、适配全面屏

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

28、AIDL的使用

全名:Android Interface Definition Language
作用:为了实现进程间通信.
   这个对我来说,用的很少,但是面试的时候会被问到,主要是实现了进程间的通信问题,一般一项目,一个进程,除非业务逻辑比较多,运行内存不够用的情况下,会使用AIDL.总体来说,主要是通过,定义接口的形式来实现,客户端服务端的数据交互,下面的链接,跟着敲一遍,基本上就明白啥事了.
推荐地址:https://github.com/leavesC/AIDLSamples

29、视频的相关内容

1、使用第三方库ijkPlayer。github地址:https://github.com/bilibili/ijkplayer,这是一个解码器,配合surfaceView可以播放视频,然后界面上的进度条,暂停,开始,声音等等功能,还是需要自己的去写的。

2、我没做过视频的项目,了解不是很深。推荐一个比较好的第三方库,https://github.com/jiajunhui/PlayerBase,这个视频做的挺好的,功能很齐全。

更多学习和讨论,欢迎加入我们的知识星球,这里有1000+小伙伴,让你的学习不寂寞~·

看完本文有收获?请转发分享给更多人


我们的知识星球第三期开期了,已达到1100人了,能连续做三期已很不容易了,有很多老用户续期,目前续期率达到50%,说明了大家对我们的知识星球还是很认可的,欢迎大家加入尽早我们的知识星球,更多星球信息参见:

欢迎加入Java和Android架构社群

如何进阶成为Java的Android版和架构师?

说两件事

640?wx_fmt=jpeg

微信扫描或者点击上方二维码领取的Android \ Python的\ AI \的Java等高级进阶资源

更多学习资料点击下面的“阅读原文 ”获取

640?wx_fmt=gif

谢谢老板,点个好看↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值