2018-06-04 笔试题
Android的四大组件是哪个,他们的作用?
Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,他需要保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
Service:后台服务于Activity,封装一个完整的功能逻辑实现,接受上层指令,完成相关的事物
ContentProvider:是Android提供的第三方应用数据的访问文案,可以派生ContentProvider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供了统一的接口模型,大大简化上层应用,对数据整合提供了更方便的途径
BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型
简述Androd常用的五种布局
线性布局 相对布局 表格布局 绝对布局 针布局
Android常用的动画有哪几种?他们的作用与区别?
补间动画相当于视图动画:只是视觉上的一个效果,实际View属性没有变化,性能好,但是支持方式少
属性动画:通过变化的属性来打到动画的效果,性能略差,支持点击等事件
帧动画:通过drawable一帧帧画处理的
Gif动画:原理同上,canvas画出来
ListView的优化布局
1)、对convetView进行判空,是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建
2)、定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载
Android的存储方式有哪些?
1)SharedPreferences 存储路径:(data/data/packagename/shares_prefs), 轻量级存储,以键值对的形式存储在xml中,一般用来保存应用中的设置属性
2)文件存储 SD卡存储多媒体文件, 文件缓存
3) Sqlite数据库 存储路径:(data/data/packagename/databases), 一种嵌入式数据库,支持sql语言,存储大量结构性数据
4)ContentProvider 进程(应用程序)间数据共享,数据源可以是sqlite,也可以是xml,相关类: ContentResolver(内容解析器), ContentObserver(数据 观察者)
5) 网络存储 天气数据的xml,json格式等等,通过HttpUrlConnection,HttpClient,或者SOAP协议获取数据
Android的启动模式有哪些?
standard模式 、singTop模式 、singTask模式 、singleInstance模式
Activity在屏幕旋转时的生命周期?
-不同条件下,旋转屏幕时,activity的生命周期发生的变化也是不一样的。总共有以下三种情况:
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
设置Activity的android:configChanges=”orientation”时,切屏会重新调用各个生命周期,切横、竖屏时都只会执行一次;
设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
需注意的是,在4.0以后的版本需要加上ScreenSize 不然不会执行onConfigurationChanged方法
执行顺序:onCreate、 onStart 、onResume、
onConfigurationChanged
详解地址(https://blog.csdn.net/qq_16064871/article/details/46480525)
注册广播有几种方式,这些方式有何优缺点,请谈谈Androidr引入广播机制的用意
1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
请解释下在单线程模型中,Message Handler MessageQUeue Looper
handler获取当前线程中的looper对象,looper用来存放Message的MessageQueue中取得Message,再有android进行Message的分发和处理
MessageQueue(消息队列) 用来存放通过handler发送过来的消息,通常附属于某一个创建他的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Hanlder 可以发布或者处理一个消息或者操作一个Runnable,通过Handler发送消息,消息将只会发送到与他消息队列,只能处理该消息队列中的消息
Looper 是Handler和消息队列之间通信桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler
Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理。在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。
Service和Thread的区别?
Thread:是程序执行的最小单位,他分配CPU的基本单位。可以用Thread执行异步操作
Serviece:是四大组件之一是android的一种机制,当他运行的时候如果是Local Service,那么对应的Service是运行在主线程main线程上
高级:
1。如何对Android程序进行性能分析?
Android性能主要之响应速度和UI刷新速度
首先从函数的耗时来说,
2。什么情况下会导致内存溢出?
一,大量位图的加载
二, Bitmap对象不在使用时调用recycle()释放内存
三, 查询数据库没有关闭游标
四,构造Adapter时,没有使用缓存的 convertView
3。如何避免OOM异常?
首先OOM是什么?
当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后
这就会抛出 OutOfMemoryException 也就是OOM
Android的OOM怎么样?
为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上限。
如何避免OOM?
减少内存对象的占用
I.ArrayMap/SparseArray代替hashmap
II.避免在android里面使用Enum
III.减少bitmap的内存占用
inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
IV.减少资源图片的大小,过大的图片可以考虑分段加载
内存对象的重复利用
大多数对象的复用,都是利用对象池的技术。
I.listview/gridview/recycleview contentview的复用
II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
这个方法在某些条件下非常有用,比如要加载上千张图片的时候。
III.避免在ondraw方法里面 new对象
IV.StringBuilder 代替+
4。Anroid如何捕获未捕获的异常?
关键是实现Thread.UncaughtExceptionHandler
然后是在application的onCreate里面注册
5。ANR是什么?怎么避免和避免ANR?
ANR------(Application Not Responding)
应用程序无响应(也就是在规定的时间内,没有响应)
ANR一般有三种类型:
1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成为
为什么会超时:事件没有机会处理 & 事件处理超时
怎么避免ANR:ANR的关键是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算而交给work thread操作。
1)避免在activity里面做耗时操作,oncreate & onresume
2)避免在onReceiver里面做过多操作
3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
4)尽量使用handler来处理UI thread & workthread的交互。
6。Android线程通信有哪几种方式?
1。Handler机制
2。runOnUiThread方法
3。View.post(Runnable r)
4。AsyncTask
7.Devik进程Linux进程线程的区别
Dalvik进程
每个android app都会独立占用一个dvm虚拟机,运行在Linux系统中,所以Dalvik进程和Linux进行是可以理解为同一个概念
8.描述下Android的系统架构
应用层 应用框架层 liunx内核层 系统运行层
9。android应用对内存是如何限制的?我们应用如何合理使用内存
activitymanager.getMemoryClass()获取内存限制
减少内存对象的占用、内存对象的重复利用
10。Handler机制
一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。 其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。调用Looper.loop()之后循环已经开始,下一个由handler发的message将会被这个handler的handleMessage方法处理,这是一个----循环。
11。事件分发机制
事假的分发过程由三个很重要的方法来共同完成的:
dispatchTouchEvent 、onInterceptTouchEvent 和onTouchEvent
(事件梳理地址: https://blog.csdn.net/android_zyf/article/details/60466323)
12。开发中使用过哪些框架,平台
百度地图 、 Volley 、 fastjson、 picciso、 友盟、 zxing、 Gson、 EventBus 时间分发机制,由handler实现,线程间通信、Xutils
13。请说下Http请求的基本过程
1。连接 建立一个socket连接
2。请求 连接成功之后,开始先webView服务器发送请求这个请求是get与post
3。应答 webView服务器接收到请求,进行处理
4。关闭连接 当应答结束后,web浏览器与web服务器必须断开
14。屏幕适配
屏幕适配的方式:xxxdpi, wrap_content,match_parent获取屏幕大小来处理
dp是适配屏幕的 sp来确定字体的大小
drawable-xxdpi,values-1280*1920等 这些都是适配的资源
warp_content,match_parent ,这些是view的自定义
weight 这是权重的适配
面试题
https://blog.csdn.net/liu852298068/article/details/52793586
https://www.cnblogs.com/android-blogs/p/6650298.html