Android面试题收集

1.静态和动态广播的区别?

生存期:静态广播的生存期可以比动态广播的长很多,因为静态广播很多都是用来对系统时间进行监听,比如我们可以监听手机开机。而动态广播会随着context的终止而终止

优先级:动态广播的优先级比静态广播高

注册:动态广播无需在AndroidManifest.xml中声明即可直接使用(用receiver注册),也即动态;而静态广播则需要,有时候还要在AndroidManifest.xml中加上一些权限的声明。静态注册是当程序关闭后,如果有广播发过来,还能启动程序。动态注册的生命周期跟程序的生命周期是一样的,程序关闭后动态注册的广播是不能在接收到广播的

动态注册的优点:在Android的广播机制中,动态注册的优先级高于静态注册的优先级,因此在必要情况下,我们需要动态注册广播接收器。

静态注册的优点:动态注册广播接收器还有一个优点就是当用来注册广播的Activity关闭后,广播也就失效了,同时反映了静态注册广播的一个优势,就是无需担心广播接收器是否关闭,只要设备处于开启状态,广播接收器就能接收。

2.一个应用是否可以有多个进程?

在AndroidManifest.xml的声明四大组件的标签中增加"android:process"属性即可,process分私有进程和全局进程,私有进程的名称前面有冒号,全局进程没有

 
 

私有进程:其它应用的组件不可以和它跑在同一个进程中
全局进程:其它应用可以通过shareUID方式和它跑在同一个进程中(相同的shareUID和签名)
ShareUID:在Android里,每个app都有一个唯一的linux user ID,因此权限就被设置成该应用程序的文件只对该用户和应用程序自身可见。假如让两个app使用相同的userID,不论是否在同一个进程,它们都能看到对方的文件,比如data目录,组件信息等。如果在同一个进程,还可以共享内存数据。


3.两个service同进程和不同进程aidl有什么区别?
4.mqtt和http的区别?

MQTT

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

  1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
  2. 对负载内容屏蔽的消息传输;
  3. 使用 TCP/IP 提供网络连接;
  4. 有三种消息发布服务质量: 
    1. “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    2. “至少一次”,确保消息到达,但消息重复可能会发生。
    3. “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

HTTP

HTTP是一个属于应用层的,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

通信方式

  • 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求。Web服务器根据接收到的请求后,向客户端发送响应信息
  • HTTP之请求消息Request:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
  • HTTP之响应消息Response:HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
  • 若connection 模式为close,则服务器会主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;


5.fragment和activity怎么通讯?

1、通过构造器
2、通过广播
3、通过EventBus
4、通过接口回调
5、通过ViewModel
6、通过Handler


6.layout优化方法?

一. 优化Layout层级

二. 重用Layout

三. 按需加载Layout

四. 优化ListView


1.线程有哪几种状态,他们之间怎么转化?

线程的六种状态
线程的生命周期主要有以下六种

New(新创建)
Runnable(可运行)
Blocked(被阻塞)
Waiting(等待)
Timed Waiting(计时等待)
Terminated(被终止)
通过getState()方法可以查看当前线程的状态
New(新创建)
表示线程被创建但是还没有启动的状态
1、当我们用 New Thread() 新建一个线程的时候,
2、如果该线程没有被start()的方法调用运行,
3、且没有开始执行run()方法 那么该线程的状态讲究是New

Runnable(可运行)
Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Running和Ready
也就是说,Java中处于Runnab1e 状态的线程有可能正在执行,也有可能没有正在执行,正在等待被分配CPU资源。

所以,如果一个正在运行的线程是Runnable状态,当它运行到任务的一半时,执行该线程的CPU被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是Runnable,因为它有可能随时被调度回来继续执行任务

阻塞状态
这三个状态我们可以统称为阻塞状态
Blocked(被阻塞)、waiting(等待)、Timed waiting(计时等待)

Blocked(被阻塞)
当线程进入到synchronized 代码块中时未能获得相应的monitor锁,此时线程从Runnable状态进入到 Blocked状态
waiting(等待)
当线程中调用了没有设置 Timeout参数的object.wait()方法
当线程调用了没有设置Timeout参数的Thread.join()方法
当线程调用了Locksupport. park()方法
Blocked与 waiting 的区别
Blocked是在等待其他线程释放monitor锁
waiting则是在等待某个条件,比如 join的线程执行完毕,或者是notify()/notifyAll()

Timed waiting(计时等待)
Timed waiting 状态与 waiting 状态非常相似,其中的区别只在于是否有时间的限制,在Timed waiting
状态时会等待超时,之后由系统唤醒,或者也可以提前被通知唤醒如notify

以下情况会让线程进入Timed waiting状态。

线程执行了设置了时间参数的Thread.sleep(long millis)方法;
线程执行了设置了时间参数的object.wait(long timeout)方法;
线程执行了设置了时间参数的Thread.join(long mi17is)方法;
线程执行了设置了时间参数的Locksupport.parkNanos(long nanos)方法和Locksupport.parkuntil(long deadline)方法。
线程状态转换
Blocked(被阻塞)转换 Runnable(可运行)状态
当线程进入到synchronized 代码块中获得相应的monitor锁,此时线程从Blocked状态进入到 Runnable状态

当线程进入到synchronized 代码块中线程被阻塞,当其获得相应的monitor锁之后,线程又会变为Runnable(可运行)状态

Waiting(等待) 和 Timed Waiting(计时等待)转换 Runnable(可运行)状态
在线程中执行 notify()和notifyAll(),
它们会先进入 Blocked状态,然后抢夺锁成功后,再回到Runnable状态。
Terminated终止状态
run()方法执行完毕,线程正常退出。
出现一个没有捕获的异常,终止了run()方法,最终导致意外终止。


2.Android提供的线程之间的交互方式有哪些?
3.service是否可以在主线程启动,怎么在主线程启动,怎么在其他线程启动?
4.多屏幕适配的方法?
5.进程间的通讯方式有哪些?
6.为什么不能在子线程更新View?

1.Handler postDelay是怎么实现的?
2.MessageQueue是什么数据结构?
3.广播是怎么做到多进程通讯的?
4.单例模式volatile的作用?
5.onMeasure什么时候需要重写?
6.mvvm如何在xml中加载一个类?
7.Android系统如何加载Launcher?
8.Activity显示启动和隐式启动的区别?
9.自定义View的方法?
10.Android事件分发机制?
11.Glide原理?
12.Glide如果更换策略?

你可能感兴趣的:(面试题,android)