Android面试笔记

v:* {behavior:url(#default#VML);}
o:* {behavior:url(#default#VML);}
w:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

Normal

0

false

false

false

false

EN-US

ZH-CN

X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}

Activity:

·
生命周期:对话框遮挡,其他Activity遮挡,锁屏,屏幕旋转,内存不足被杀掉。

·
onNewIntent调用时onCreate(),onStart()方法不会被调用

·
可以把不同的 应用中的activity的taskAffinity设置成相同的值,这样的话这两个activity虽然不在同一应用中,却会在运行时分配到同一任务中

Context:

·
继承关系

[图片上传中。。。(1)]

·
初始化顺序:

[图片上传中。。。(2)]

·
IntentService:省去了在Service中手动开线程的麻烦,不用手动停止Service

·
其他

ContentProvider:

·
管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在DB,XML、Preferences或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。

提供一种跨进程数据共享的方式。

·
URI

[图片上传中。。。(3)]

·
ContentResolver通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。

·
ContentObserver(内容观察者),目的是观察特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它

·
其他

BroadcastReceiver:

·
在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。不在onCreate()
& onDestory() 或 onStart() & onStop()注册、注销是因为:当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。

·

[图片上传中。。。(4)]

·
对于不同注册方式的广播接收器回调OnReceive(Context
context,Intent
intent)中的context返回值是不一样的:

对于静态注册(全局+应用内广播),回调onReceive(context,
intent)中的context返回值是:ReceiverRestrictedContext;

对于全局广播的动态注册,回调onReceive(context,
intent)中的context返回值是:Activity
Context;

对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context,
intent)中的context返回值是:Application
Context。

对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context,
intent)中的context返回值是:Activity
Context;

Handler:

·
主线程中已经实现了两个重要的Looper方法,
ActivityThread中调用Looper.prepareMainLooper();

·
一个Thread只有一个Looper对象,一个MessageQueue对象;Looper分发消息是阻塞式的(might
block),即一个消息分发完成之后才会处理下一个消息。

内存:

·
Java虚拟机栈:线程私有的,其生命周期和线程一致,描述的是Java方法执行的内存模型。每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。(线程私有)

·
Java堆:是虚拟机管理内存中最大的一块,被所有线程共享,该区域用于存放对象实例,几乎所有的对象都在该区域分配。Java堆是内存回收的主要区域,从内存回收角度看,由于现在的收集器大都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,再细分一点的话可以分为Eden空间、From Survivor空间、To Survivor空间等。根据Java虚拟机规范规定,Java堆可以处于物理上不连续的空间,只要逻辑上是连续的就行。(线程共享)

网络:

·
Socket 是对 TCP/IP 协议的封装,Socket
只是个接口不是协议,通过
Socket 我们才能使用
TCP/IP 协议,除了
TCP,也可以使用
UDP 协议来传递数据。创建
Socket 连接的时候,可以指定传输层协议,可以是
TCP 或者
UDP,当用
TCP 连接,该Socket就是个TCP连接,反之。

·
若双方是 Socket 连接,可以由服务器直接向客户端发送数据。若双方是
HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。

·
http 为短连接,Socket为长连接。

·
HTTP 的缺点:

通信使用明文(不加密),内容可能会被窃听

不验证通信方的身份,因此有可能遭遇伪装

无法证明报文的完整性,所以有可能已遭篡改

·
其他

View:

[图片上传中。。。(5)]

·
调用requestLayout()的时候,会触发measure

layout 过程,调用invalidate,会执行 draw
过程。

·
onTouch()和onTouchEvent()的区别:这两个方法都是在View的dispatchTouchEvent中调用,但onTouch优先于onTouchEvent执行。如果在onTouch方法中返回true将事件消费掉,onTouchEvent()将不会再执行。

·
接收了ACTION_DOWN事件的函数不一定能收到后续事件(ACTION_MOVE、ACTION_UP)

·
如果在某个对象(Activity、ViewGroup、View)的dispatchTouchEvent()消费事件(返回true),那么收到ACTION_DOWN的函数也能收到ACTION_MOVE和ACTION_UP。

·
如果在某个对象(Activity、ViewGroup、View)的onTouchEvent()消费事件(返回true),那么ACTION_MOVE和ACTION_UP的事件从上往下传到这个View后就不再往下传递了,而直接传给自己的onTouchEvent()并结束本次事件传递过程。

Window:

[图片上传中。。。(6)]

[图片上传中。。。(7)]

·
MeasureSpec是一个32位整数,由SpecMode和SpecSize两部分组成,其中,高2位为SpecMode,低30位为SpecSize。SpecMode为测量模式,SpecSize为相应测量模式下的测量尺寸。View(包括普通View和ViewGroup)的SpecMode由本View的LayoutParams结合父View的MeasureSpec生成。

SpecMode的取值可为以下三种:

EXACTLY: 对子View提出了一个确切的建议尺寸(SpecSize);

AT_MOST: 子View的大小不得超过SpecSize;

UNSPECIFIED: 对子View的尺寸不作限制,通常用于系统内部。

·
Draw顺序:绘制背景(drawBackground(canvas)),绘制自身内容(onDraw(canvas)),绘制子View(dispatchDraw(canvas)),绘制滚动条等(onDrawForeground(canvas))

·
这也就是为什么我们在onCreate方法中调用view.getMeasureHeight()
= 0的原因,我们知道activity.handleResumeActivity最后调用到的是activity的onResume方法,但是按上面所说在onResume方法中调用就可以得到了吗,答案肯定是否定的,因为ViewRootImpl绘制View并非是同步的,而是异步(Handler)

·
ViewRootImpl也是有事件分发的。要知道,当用户点击屏幕产生一个触摸行为,这个触摸行为则是通过底层硬件来传递捕获,然后交给ViewRootImpl,接着将事件传递给DecorView,而DecorView再交给PhoneWindow,PhoneWindow再交给Activity,然后接下来就是我们常见的View事件分发了。

·
WindowManager.LayoutParams中有三种类型,分别为

应用程序窗口
: type值在
FIRST_APPLICATION_WINDOW ~ LAST_APPLICATION_WINDOW 须将token设置成Activity的token。eg:前面介绍的Activity窗口,Dialog

子窗口:
type值在
FIRST_SUB_WINDOW ~ LAST_SUB_WINDOW SubWindows与顶层窗口相关联,需将token设置成它所附着宿主窗口的token。eg:
PopupWindow(想要依附在Activity上需要将token设置成Activity的token)

系统窗口:
type值在
FIRST_SYSTEM_WINDOW ~ LAST_SYSTEM_WINDOW SystemWindows不能用于应用程序,使用时需要有特殊权限,它是特定的系统功能才能使用。eg:
Toast,输入法等。

·
View 是 Android 中的视图的呈现方式,但是
View 不能单独存在,它必须附着在
Window 这个抽象的概念上面,因此有视图的地方就有
Window。哪些地方有视图呢?Android
可以提供视图的地方有
Activity、Dialog、Toast,除此之外,还有一些依托
Window 而实现的视图,比如
PopUpWindow(自定义弹出窗口)、菜单,它们也是视图,有视图的地方就有 Window,因此
Activity、Dialog、Toast等视图都对应着一个
Window。这也是面试中常问到的一个知识点:一个应用中有多少个
Window?

·
前提

线程&锁:

·
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中。

·
对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。

·
java.util.concurrent.locks.Lock是一个类似于
synchronized 块的线程同步机制。但是 Lock 比 synchronized 块更加灵活、精细,一般由ReentrantLock实现。

·
一个 Lock 对象和一个
synchronized 代码块之间的主要不同点是:

synchronized 代码块不能够保证进入访问等待的线程的先后顺序。

你不能够传递任何参数给一个
synchronized 代码块的入口。因此,对于 synchronized 代码块的访问等待设置超时时间是不可能的事情。

synchronized 块必须被完整地包含在单个方法里。而一个 Lock 对象可以把它的 lock()和
unlock() 方法的调用放在不同的方法里。

·
AtomicBoolean,AtomicInteger,AtomicLong

·
AtomicReference 提供了一个可以被原子性读和写的对象引用变量。原子性的意思是多个想要改变同一个
AtomicReference 的线程不会导致 AtomicReference 处于不一致的状态。AtomicReference还有一个
compareAndSet() 方法,通过它你可以将当前引用于一个期望值(引用)进行比较,如果相等,在该
AtomicReference 对象内部设置一个新的引用。

·
其他

����}ZX��,3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容