您的位置 首页 java

Android & Java面试详细个人总结

温馨提示:

本文很长很长,我用了6个小时整理的面试总结,干货满满,建议收藏。

我每天都会发表一些架构师方面的知识点文章或者面试总结,喜欢的朋友可以关注一下,一定不会让你失望的。需要架构师资料可以私信我,回复【资料】即可。

Java部分

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

Android & Java面试详细个人总结

二、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效果图

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

continue实例

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

return效果图

五、面向对象和面向过程

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

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

面向对象三个特征:

封装,继承,多态

封装:

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。get()/set()方法

继承:

子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为

这个很好理解,解析数据的时候,大家应该都有一个BaseBean,然后去继承他,不用重复写代码,利于代码的复用性

多态:

多态是指父对象中的同一个行为能在其多个子对象中有不同的表现。

也就是说子对象可以使用重写父对象中的行为,使其拥有不同于父对象和其它子对象的表现,这就是overriding(重写)

多态存在的三个必要条件:

一、要有继承;

二、要有重写;

三、父类引用指向子类对象

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

六、equals()和==的区别

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

equals 用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,

而Object中的equals方法返回的却是==的判断。

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

工厂模式:

android中的demo体现:线程池

这个链接,very good,对我来说,非常好理解,what is 工厂模式???我是在这儿学的,原谅我这个菜鸟吧,不会总结.

最好把demo敲一遍,加深记忆,很好理解,虽然看也是可以看懂的.

建造者模式:

android中,大概build()结尾的都是吧.比如:Imagrloder,AlertDialog.Builder等等.

装饰者模式:

单例模式:

饿汉式:

//只有内部类可以为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

推荐链接:

MVC

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

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

MVP

数据关系:

View 接收用户交互请求

View 将请求转交给 Presenter

Presenter 操作Model进行数据更新

Model 通知Presenter数据发生变化

Presenter 更新View数据

使用:

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

MVVM

Model-View-ViewModel

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="">
 <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=""
 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.1f, 1.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=""
 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。

推荐学习链接:

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方法中通过判断返回值,来确定onClickListener的onClick方法是否会执行,如果返回false,都能执行,如果返回true,onClick不执行。

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

客户端和服务器一直保持长链接

推荐链接:

16、map集合的存储原理

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

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

有三个构造方法(一个参数、两个参数、三个参数),其中两个参数的构造方法必须有。

onDraw()方法必须有,是用来绘制View图像的

如果要改变View 的大小,需要重写onMeasure()方法。

如果要改变View在父控件中的位置,需要重写onLayout()方法

18、Alipay的支付流程?

Android & Java面试详细个人总结

支付宝支付流程

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、屏幕适配的方法

Android & Java面试详细个人总结

屏幕适配

26、图片的三级缓存

内存缓存,优先加载,速度最快

本地缓存,次优先加载,速度快

网络加载,不优先加载,速度慢,浪费流量

原理:

图片缓存流程

推荐链接:

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.总体来说,主要是通过,定义接口的形式来实现,客户端服务端的数据交互,下面的链接,跟着敲一遍,基本上就明白啥事了.

推荐地址:

29、视频的相关内容

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

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

更多学习和讨论,欢迎加入qq群,领取学习资料

文章来源:智云一二三科技

文章标题:Android & Java面试详细个人总结

文章地址:https://www.zhihuclub.com/184065.shtml

关于作者: 智云科技

热门文章

评论已关闭

3条评论

网站地图