android面试笔记

1、activity的生命周期

按照顺序分别是:onCreate(),onStart(),onRestart(),onResume(),onPause(),onStop(),onDestory();
完整生命周期:一个activity从出现到消失,对应的周期方法是从onCreate()到onDestory();
可见生命周期:当activity处于用户可见状态,将多次执行从onStart()到onStop();
前景生命周期:当activity可以与用户交互时,将多次执行从onResume()到onPause();

2、Fragment的生命周期

onAttach():在fragment与Activity关联之后调用
onCreat():fragment初次创建时调用(此时Activity还没创建,在onCreat()中使用Activity中的一些资源,会获取不到)
onCreateView():在这个fragment构造它的用户接口视图(即布局)时调用
onViewCreate():
onActivityCreated():在Activity的OnCreate()结束后,会调用此方法
onStart():Fragment对用户就是可见
onResume():当这个fragment对用户可见并且正在运行时调用
onPause():此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。
onStop():这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()
onDestroyView():如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。

3、如果后台的Activity被系统回收了,如何在被回收之前保存当前状态

调用onSaveInstanceState() 方法保存数据:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
outState.putString("text", "输入框内容");
}

在onCreate()中恢复保存的数据:

if(savedInstanceState!=null){
String statetextString=savedInstanceState.getString("text");
}
4、如何将activity设置成窗口化

方法1:在styles.xml文件中,可以新建如下的类似Dialog的style

<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog"> </style>

然后在AndroidManifest.xml中在需要显示为窗口的Activity中添加如下属性:

android: theme="@style/Theme.FloatActivity"

方法2:直接添加对应需要展示为Dialog style的Activity的android: theme属性

android: theme="@android:style/Theme.Dialog"
5、如何退出activity?如何安全退出已调用多个activity的application?

对于单一的activity,直接finish()即可,或者可以使用killProcess()和System.exit();
对于多个activity,可以定义一个list<activity>,实现创建的时候将activity缓存在list中,销毁的时候从list中移除,按退出按钮,则遍历整个List将Activity一一销毁;

6、Android的数据存储方式

1)SharePreference:采用XML格式将数据存储在设备中,只能在同一包名内使用
2)文件存储:存储文件到 /data/data/包名/files 内存里面,默认是私有的访问权限
3)SQLite数据库:android自带的轻量级嵌入式数据库,支持SQL语句
4)ContentProvider:主要用于应用程序之间的数据交换
5)网络存储:通过网络上的存储空间上传下载数据

7、ContentProvider如何实现数据共享

ContentProvider是以Uri的形式对外提供数据,ContenrResolver是根据Uri来访问数据
1)定义自己的ContentProvider类,继承系统的ContentProvider类
2)在Mainifest.xml文件中注册ContentProvider,注册时需要绑定一个URL

<manifest .... >  
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider"  
               android:authorities="com.faith.providers.personprovider" />  
    </application>  
</manifest>  

3)其他程序调用ContentReslover的insert(),delete(),update(),query()进行增删改查

8、Android的五种常用的布局

FrameLayout(帧布局) :从屏幕左上角开始布局,叠加显示
LinearLayout(线性布局):可分为垂直水平布局
AbsoluteLayout(绝对布局):用X Y 坐标定制元素位置
RelativeLayout(相对布局):以一个元素为参照物,来定义元素位置
TabLeLayout(表格布局):行和列的表格布局

9、如何启动service,如何停用service

1)调用Context.startService()方法启动服务,在服务未创建时先调用onCreat()方法,接着调用onStart()方法
调用Context.stopService()方法结束服务,结束服务时会调用onDestroy()方法
2)调用Context.bindService()方法启动服务,在服务未创建时先调用onCreat()方法,接着调用onBind()方法,此时服务和调用者绑定在一起
当调用者退出系统时,服务会调用onUnbind()-->onDestroy()方法
解除绑定调用unvindService()方法,调用此方法也会导致系统服务调用onUnbind()-->onDestroy()方法

10、activity启动方式

1)通过AndroidMainifest.xml给Activity 指定启动模式
2)通过intent中设置标志位为Activity 指定启动模式

11、activity的四种启动模式

1)standard-默认模式:每次启动一个Activity都会重写创建一个新的实例
2)singleTop-栈顶复用模式:这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。
3)singleTask-栈内复用模式:如果栈中存在这个Activity的实例就会复用这个Activity,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法
4)singleInstance-全局唯一模式:该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例

12、自定义View

自定义View主要分以下三种:
1.自定义组合控件 (多个控件组合成为一个新的控件,方便多处复用)

2.继承系统提供的成熟控件(比如LinearLayout,RelativeLayout,ImageView等,在系统控件的基础功能上进行扩展)

3.直接继承自系统View或者ViewGroup,并自绘现实内容 (View的绘制基本由measure()、layout()、draw()这个三个函数完成,measure()测量View的宽高 , layout()计算当前View以及子View的位置 , draw()视图的绘制工作)

13、MVC

MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。C存在的目的则是确保M和V的同步
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。

通常模型对象负责在数据库中存取数据。

View(视图)是应用程序中处理数据显示的部分。

通常视图是依据模型数据创建的。

Controller(控制器)是应用程序中处理用户交互的部分。

14、MVP

MVP分离了view和model层
Presenter层充当了桥梁的角色
View层只负责更新界面即可
这里的View我们要明白只是一个viewinterface,它是视图的接口,这样我们在做单元测试的时候可以非常方便编写Presenter层代码
View: 是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口。View通常含有Presenter的引用。在Android开发中通常将Activity或者Fragment作为View层。

Model: 对于Model层也是数据层。它区别于MVC架构中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等。

Presenter:对于Presenter层他是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示。这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同时也将业务逻辑从View中抽离。

15、MVVM

Model是数据层,View是用户界面 View-Model是连接View和Model的桥梁,实现View和Model双向绑定。
当数据变化时,ViewModel监听到数据的变化,自动更新视图
当用户操作视图,ViewModel也能监听到视图的变化,通知数据做改动

16、65536错误是怎么回事

该错误主要是由于我们打包后classes.dex文件里方法数量超出的65536个。
预防方法主要是少写方法,多用基类,能不用兼容包的就不要用兼容包的,引入jar或library工程时注意下它们的方法数,但是如果实在没办法,就用这个方法解决:
第一步:在项目的grade文件里面的defaultConfig闭包下添加: multiDexEnabled true

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        multiDexEnabled true

第二步:在dependencies下添加依赖 compile 'com.android.support:multidex:1.0.0'
第三步:自定义继承于Application的类,并重写protected void attachBaseContext(Context base)方法,调用 MultiDex.install(this)初始化,最后记得在Manifest清单里注册自定义的application类

17、内存溢出(OOM):指的是申请不到足够的内存;

原因:1、内存一次性开销过大(加载巨图)。2、内存持续性开销(循环创建对象)。3、内存回收不及时(内存开销过快,GC频率跟不上开销速度等)。4、内存无法回收(内存泄漏导致内存溢出)。
解决方案:1、调整图像大小。2、尽可能不在循环中申请内存。3、及时回收图像。

18、内存泄露(Leak):无法释放已申请的内存;

原因:1、静态变量(单例模式)。2、监听器。3、内部类(内部类持有外部引用)。4、资源对象未关闭。5、容器中的对象没有清理。6、webview。
避免内存泄漏方法:
1、不要在匿名内部类中进行异步操作
2、将非静态内部类转为静态内部类 + WeakReference(弱引用)的方式
3、使用Context时,尽量使用Application 的 Context
4、尽量避免使用static 成员变量。另外可以考虑lazy初始化
5、为webView开启另外一个进程,通过AIDL与主线程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放
6、及时关闭资源。Bitmap 使用后调用recycle()方法

19、ANR问题

ANR全称:Application Not Responding,也就是应用程序无响应。

以下四个条件都可以造成ANR发生:
InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
ContentProvider Timeout :ContentProvider的publish在10s内没进行完成。

造成ANR的原因及解决办法:
1、主线程阻塞或主线程数据读取。解决办法:使用子线程处理耗时任务或者阻塞任务
2、CPU满负荷,I/O阻塞。解决办法:文件读写或者数据库操作放在子线程。
3、内存不足。解决办法:优化内存,防止内存泄漏。
4、各大组件ANR。解决办法:各大组件的生命周期也应避免耗时操作。

20、Handler

Handler是Android SDK来处理异步消息的核心类。
子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。

Hander原理

Handler,loop轮询检测发送消息到MessagerQuery,MessageQuery对Message入列,Handler回调方法处理消息,重写handMessage方法刷新ui

21、ListView和RecylerView的区别,以及如何优化

1、 缓存不同:
ListView是2级缓存,RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。
2、adapter不同
ListView有自带的Adapter,例如ArrayAdapter等,而RecylerView所有的adapter必须由自己实现。
3、布局不同
ListView布局较为单一,只有纵向布局,RecylerView横向、纵向、表格、瀑布流都可以实现。
4、刷新区别
ListView中通常使用全局刷新函数notifyDataSetChanged()来刷新ListView中的所有数据,这是一个非常耗费资源的行为,RecyclerView则可以实现数据的局部刷新,例如notifyItemChanged()函数等。
5、 动画区别:
在RecyclerView封装的类中已经自带了很多内置的动画API,而ListView则需要自己实现。
6、item点击事件:
ListView提供了setOnItemClickListener()这样的item点击事件,而RecylerView没有,需要自己实现。

ListView的优化:

优化方式一:
convertView的复用,进行布局的复用。
优化方式二:
ViewHolder的使用,避免每次都findviewById。
优化方式三:
使用分段加载。
优化方式四:
使用分页加载。

22Android性能优化

布局优化: 减少布局层级,使用ViewStub提高显示速度,布局复用,尽可能少使用warp_content,删除空间中无用的属性,避免过度绘制移除window默认背景,按需显示展位图,自定义View优化,使用canvas.clipRect()识别可见区域
启动速度:采用分布加载,异步加载,延期加载提高应用初始化速度,采用线程初始化数据等,合理的刷新机制
内存方面:防止内存泄露,使用一些第三方工具检测解决(LeakCanary)
代码优化:遵循Java生命周期
安装包优化:删除无用资源,优化图片,代码混淆,避免重复库存在,插件化

23Android 23种设计模式

1、Android 单例模式
2、Android Builder模式
3、Android 原形模式(深浅拷贝)
4、Android 工厂模式
5、Android 策略模式
6、Android 状态模式
7、Android 责任链模式
8、Android 命令模式
9、Android 观察者模式
10、Android 备忘录模式
11、Android 迭代器模式
12、Android 模板方法模式
13、Android 访问者模式
14、Android 中介者模式
15、Android 代理模式
16、Android 组合模式(View与ViewGroup)
17、Android 适配器模式(ListView与Adapter)
18、Android 装饰者模式
19、Android 享元模式
20、Android 外观模式
21、Android 桥接模式

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

推荐阅读更多精彩内容