Android面试整理(应付面试简单版本)

本文介绍了Android平台的关键技术,包括Activity的启动模式、数据存储方式、线程同步机制、内存管理和性能优化等方面的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的四种启动模式

standard: 一调用startActivity()方法就会产生一个新的实例。 
singleTop: 位于Activity 栈顶就直接复用。如果不位于栈顶就产生一个新的实例。 
singleTask: 会在一个新的task 中产生这个实例,以后每次调用都会使用这个实例,不会去产生新的实例了。 
singleInstance: 这个跟singleTask 基本上是一样,只有一个区别:Activity实例所处的task中,只能有这个activity实例。

Android数据储存方式 

SharedPreferences,文件存储,Sqlite,Content provide,网络存储

sim卡的EF 文件有何作用

存储,手机通讯作用

Override和Overload的区别。

Override:子类和父类方法一样,父类该方法会被屏蔽。

Overload:方法名相同,但参数类型、个数、返回值可不同。

线程安全和非线程安全的区别

线程安全必须使用很多synchronized来同步控制,会导致性能的降低

非线程安全 ArrayList HashMap  StringBuilder

线程安全   Vector HashTable  StringBuffer

Collection 和 Collections的区别

Collection是集合类的上级接口,继承他的接口主要有Set和List。
Collections是集合类的帮助类,他提供一系列静态方法实现对各种集合的搜索排序线程安全化等操作。

final, finally, finalize的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 
finally 是异常处理语句结构的一部分,表示总是执行。 
finalize 是Object类的一个方法,当这个Object类被GC的时候会被调用。

sleep() 和 wait() 的区别

1.sleep来自Thread类,和wait来自Object类。 
2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。 
3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
4.Sleep需要捕获异常,wait不需要

对于Android的安全问题

1.不混淆或不做其他加密就发布 2.明文存储关键信息

3.使用对称加密和非对称加密

 对称加密:加密解密都用同一个key,如DES加密。    非对称加密:使用公钥和私钥。使用公钥加密则用私钥解密,反之。

4.错误使用HTTPS    https的证书一般都是自签的,httpclient中没有对应的证书权限。

 解决方法:连接之前将服务器证书加到httpclient的信任证书列表中,或让httpclient信任所有证书

ANR出现情况

Activity 5秒, Broadcast 10秒, Service 20秒

Activity生命周期

Activity打开:onCreate() -> onStart() -> onResume()

Activity关闭:onPause() ->  onStop()  -> onDestroy()

被全遮挡:onPause() -> onStop()    返回:onRestart() -> onStart() ->onResume()

不全遮挡:onPause()           返回:onResume()

广播

常驻型(静态注册):程序关闭后如果有广播信息来还是可以接收到     非常驻型(动态注册):生命周期跟随程序

layout-sw600dp, layout-h600dp分别代表什么意思

px:屏幕上实际的像素点单位     dipdp:设备独立像素,与设备屏幕有关
sp:类似dp,主要处理字体的大小 dpi:屏幕像素密度,每寸多少像素

3.2之前:layout-large:当屏幕>7寸的时候就会使用

3.2或之后:layout-sw600dp:屏幕最小的边>=600dp的时候会使用这个文件夹下的资源文件;layout-h600dp:屏幕最长边边长>=600dp

适配3.2之前和之后的版本布局做法(这样就可避免维护三个布局文件):

1./values/layout.xml <item name=”main”type=layout>@layout/main.xml</item>

2./values-large/layout.xml <item name=”main”type=layout>@layout/main_large.xml</item>

3./values-sw600dp/layout.xml <item name=”main”type=layout>@layout/main_large.xml</item>

平板横竖屏:/values-sw600dp-port/layout.xml 竖屏;/values-sw600dp-land/layout.xml 横屏

屏幕适配的方式有哪些

1.使用不同dimens     2.使用不同的values/layout.xml         3.使用不同的drawable  

3.使用.9图片      4.切多套图片(避免图片与实际分辨率不同,造成内存占用高)

SharedPreferences提交数据的方法:apply() commit()

1.返回值:apply无 commit返回boolean

2.apply是将修改数据原子提交到内存,异步提交到硬件磁盘。

 commit是同步的提交到硬件磁盘,效率低。

Message、Handler、Message Queue、Looper之间的关系

1 线程:启动程序时主线程会建立一个Message Queue。

2 Message Queue: 用来存线程放入的消息。

3 Looper: 一个线程产生一个Looper对象来管理线程内对象之间的消息交换

4 Handler: Handler与Looper沟通,push消息到Message Queue里;或获取Message Queue收到的消息。

View, SurfaceView, GLSurfaceView的区别 

View 是最基础的,必须在 UI 主线程内更新画面,速度较慢。

SurfaceView 是 view 的子类,使用双缓机制,在新的线程中更新画面所以刷新界面速度比 view 快 GLSurfaceView 是 SurfaceView 的子类,opengl 专用的。 

区别:SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView。

Activity和Service之间有什么通讯方式

广播、Binder、EventBus

AsyncTask的内部实现,适用的场景是?

AsyncTask内部也是Handler机制来完成的,提供线程池来执行相应的任务,因为线程池的大小问题,所以AsyncTask只应该用来执行耗时较短的任务,比如HTTP请求,大规模的下载和数据库的更改不适用于AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生AsyncTask根本执行不了的问题。

Android中进程间通信有哪些实现方式?
Intent,Binder(AIDL),Messenger,BroadcastReceiver

同一个应用程序的不同Activity可不可以运行在不同的进程中

可以,在xml配置Activity的android:process。remote前面冒号为私有进程,否则为全局进程。

Java中的线程同步(线程同步有哪几种)

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
AllNotity():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

设计模式

单例模式 工厂模式 构建者模式 原型模式(Clone,浅度、深度) 适配器模式 ...

DDMS 和TraceView有什么区别

DDMS:测试设备截图,线程和堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等。

TraceView:通过图形化界面查看界面层级来进行优化。

UIAutomator:可以调用方法来操作界面中的各个控件,模拟动作。

区别:DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,而TraceView是程序性能分析器。

什么是嵌入式实时操作系统,Android属于实时操作系统吗

嵌入式操作系统通过外界事件,以快速的接收能力处理事件,是硬实时操作系统。

Android是Linux操作系统,是软实时操作系统。

android的系统架构

linux内核层:做一些内存管理、进程管理的工作,各种驱动模型

运行库:一些C和C++库,比如sqlite,Webkit(浏览器引擎)和媒体库

应用框架层:android提供的各种api

应用程序层:运行在虚拟机上的程序

ART模式

4.4加入了ART(AndroidRuntime)开关。作用:安装APP的时候预编译代码转成机器语言放在本地,不用每次运行APP都去重新编译。

protobuf

一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。

支持c++,java,python,序列化和反序列化的效率非常高

优化

内存泄漏:

1.使用了单例模式传入了ActvityContext,导致Context没有及时销毁。应该使用ApplicationContext。

2.静态变量持有大数据

3.资源对象未关闭 ,如Cursor、File、Socket

ArrayList,Vector,LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,插入数据涉及数组移动的内存操作,索引快,插入慢。

Vector是线程安全的,使用了同步机制,所以速度比ArrayList慢。

LinkedList使用双向链表实现存储,索引数据是进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

ListView的优化

1.复用contentView    2.使用ViewHoler     3.分页加载   4.减少Item的视图层数

堆和栈

栈 存在栈中的数据大小与生存期是确定的,栈数据可以共享(总是会先创建值,然后再创建引用,再将引用指向值)

堆 动态地分配内存大小,生存期不用告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要动态分配内存,存取速度较慢

Java中的数据类型有两种。  基本类型 ,包装类型

HashTable和HashMap区别

HashTable是线程安全的。HashMap允许null key和null value,而HashTable不允许

线程有多少种状态

New:指线程刚创建, 尚未启动

Runnable:线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等

Blocked : 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区

Waiting:指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在理解点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束

TimedWaiting :这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入TIMED_WAITING状态

Terminated:这个状态下表示 该线程的run方法已经执行完毕了, 基本上就等于死亡了(当时如果线程被持久持有, 可能不会被回收)

请分别说明HTTP、TCP、IP三层协议中,接收端如何判断已接受完对端发送来的数据?

在http中,会有一个状态代码,一般状态代码等于200表示接收完成,不等于200就会出现其他错误,比如404访问路径错误和500服务器没有反应等等。

在ip数据包中会有一个数据包开始和结束标识符,并且在获得数据后会对数据进行一个校验来判断是否有数据在传输过程中丢失

XUtils框架组成部分:ViewUtil,HttpUtil,DbUtil,BitmapUtil

NIO Socket:通过Selector和ServerSocketChannel在轮询中判断key的个数,当大于0的时候,就从Channel中取出信息消息。

Bitmap内存优化:(3.0之后recycle已经被放到栈中由GC管理,所以不用调用)

1.使用适当分辨率和大小的图片

2.使用图片缓存(内存缓存和硬盘缓存)

EventBus原理:

1.EventBus中有个Map<Class<?>,MethodName>,在register的时候就会将类对象和类中以onEvent开头的方法加入。并从Map中遍历找出那些对应类和父类的onEvent方法,放在一个List<Methed>中。

2.Post的时候会把方法放入事件队列中,然后通过判断是否在已经注册的Map中,如果存在,就通过反射直接调用。

3.UnRegister的时候就会通过传入类,把改类从Map中移除。

View的工作流程:

measure(测量出所占宽高) -> layout(确定四个点的坐标) ->draw(绘制到界面)

measureWidth/Height在measure中被赋值,width和height在layout中被赋值。最终会相等,但measure是多次测量的,所以需要最终的measureWidth/Height才会和width/height相等。

layout是通过循环调用内部子视图的onLayout一层层确定位置。

draw  绘制背景,自己,child

Activity创建的时候获取Width/Height的方法:

1.onWindowFocusChanged  2.view.post(runnable)  3.onGlobalLayoutListener(视图每次改变都会被调用)  4.view.measure

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SammieZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值