Android面试题总结(六)Android源码篇
1.Android各版本API区别?
https://blog.csdn.net/andypan1314/article/details/6583563(转)
2.Requestlayout,onlayout,onDraw,DrawChild区别与联系
requestLayout()方法 :会导致调用measure()过程 和 layout()过程 。 说明:只是对View树重新布局layout过程包括measure()和layout()过程,不会调用draw()过程,但不会重新绘制 任何视图包括该调用者本身。
onLayout()方法(如果该View是ViewGroup对象,需要实现该方法,对每个子视图进行布局)
调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)
drawChild()去重新回调每个子视图的draw()方法
https://blog.csdn.net/weixin_41101173/article/details/79726311(转)
3.invalidate和postInvalidate的区别及使用
https://www.jianshu.com/p/e147f381190c(转)
4.Activity-Window-View三者的差别?
https://juejin.im/entry/596329686fb9a06bc903b6fd
5.谈谈对Volley的理解?
https://www.jianshu.com/p/a35afb377d7f
6.如何优化自定义view?
http://hukai.me/android-training-course-in-chinese/ui/custom-view/optimize-view.html(官方文档)
7.低版本SDK如何实现高版本API?
https://www.cnblogs.com/yaowen/p/5732614.html
8.描述一次网络请求的流程?
https://blog.csdn.net/SEU_Calvin/article/details/53304406
https://www.jianshu.com/p/f184b8cee0a4
9.网络请求框架的对比?
https://www.jianshu.com/p/2fa728c8b366
https://blog.csdn.net/zxm317122667/article/details/53234556
10.Looper架构?
https://blog.csdn.net/hengqiaqia/article/details/78335239
11.Android源码:AMS、PMS、WMS原理分析
https://blog.csdn.net/shareus/article/details/51174623
12.自定义view如何考虑机型适配
- 合理使用warp_content,match_parent.
- 尽可能的是使用RelativeLayout
- 针对不同的机型,使用不同的布局文件放在对应的目录下,android会自动匹配。
- 尽量使用点9图片。
- 使用与密度无关的像素单位dp,sp
- 引入android的百分比布局。
- 切图的时候切大分辨率的图,应用到布局当中。在小分辨率的手机上也会有很好的显示效果
13.Android中AsyncTask详解?
https://blog.csdn.net/iispring/article/details/50639090
14.SpareArray原理?
在Android开发中如果使用key为Integer的HashMap,就会出现黄色警告,提示使用SparseArray,SparseArray具有比HashMap更高的内存使用效率,HashMap的存储方式是数组加链表,SparseArray是使用纯数组的形式存储,SparseArray采用时间换取空间的方式来提高手机App的运行效率,这也是其与HashMap的区别;HashMap通过空间换取时间,查找迅速;HashMap中当table数组中内容达到总容量0.75时,则扩展为当前容量的两倍
- SparseArray的key为int,value为Object。
- 在Android中,数据长度小于千时,用于替换HashMap
- 相比与HashMap,其采用 时间换空间 的方式,使用更少的内存来提高手机APP的运行效率(HashMap中当table数组中内容达到总容量0.75时,则扩展为当前容量的两倍
https://blog.csdn.net/xiaxl/article/details/77267201
15.ContentProvider是如何实现数据共享的?
当一个应用程序需要把自己的数据暴露给其他程序使用时,该就用程序就可通过提供ContentProvider来实现;其他应用程序就可通过ContentResolver来操作ContentProvider暴露的数据。
一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过该接口来操作该应用程序的内部数据,包括增加数据、删除数据、修改数据、查询数据等。
ContentProvider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作指定数据。
步骤:
1、定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。
2、在AndroidManifest.xml文件中注册个ContentProvider,注册ContenProvider时需要为它绑定一个URL。
例:
说明:authorities就相当于为该ContentProvider指定URL。
注册后,其他应用程序就可以通过该Uri来访问MyProvider所暴露的数据了。
接下来,使用ContentResolver操作数据,Context提供了如下方法来获取ContentResolver对象。
一般来说,ContentProvider是单例模式,当多个应用程序通过ContentResolver来操作 ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。
使用ContentResolver操作数据只需两步:
1、调用Activity的ContentResolver获取ContentResolver对象。
2、根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据即可
16.Activity与Service通信有哪几种方式?
(1)通过Binder对象
(2)通过Broadcast广播形式
(3)通过接口
(4)通过Intent
17.IntentService原理及其使用?
用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service,第三,使用操作方便
https://blog.csdn.net/ryantang03/article/details/8146154
18.说说Activity,Intent,Service之间的关系?
一个 Activity 通常是一个单独的屏幕,
每一个 Activity 都被实现为一个单独的类,
这些类都 是从 Activity 基类中继承来的,
Activity 类会显示由视图控件组成的用户接口,
并对视图控 件的事件做出响应。
Intent 的调用是用来进行架构屏幕之间的切换的。
Intent 是描述应用想要做什么。
Intent 数 据结构中两个最重要的部分是动作和动作 对应的数据,
一个动作对应一个动作数据。
Android Service 是运行在后台的代码,
不能与用户交互,可以运行在自己的进程,也可以 运行在其他应用程序进程的上下文里。
需要通过某一个 Activity 或者其他 Context 对象来调 用。
Activity 跳转到 Activity,Activity 启动 Service,Service 打开 Activity
都需要 Intent 表明跳转 的意图,以及传递参数,Intent 是这些组件间信号传递的承载者。
19.Application Context和Activity Context的区别
1.Application的Context是一个全局静态变量,SDK的说明是只有当你引用这个context的生命周期超过了当前activity的生命周期,而和整个应用的生命周期挂钩时,才去使用这个application的context。一种推荐的用法就是应用程序注册广播broadcast时,使用这个context。引用application context并不会导致内存泄漏。引用activity的context才会导致内存泄漏,当你的引用对象的生命周期超过了当前activity的生命周期时,系统回收你的activity时发现还有一个context的强引用,而不去销毁这个activity,导致内存泄漏,在开发过程中,需要非常重视这点(一个全局静态变量在引用context时一定要使用application的Context, 而不要使用activity的)2.在android中context可以作很多操作,但是最主要的功能是加载和访问资源。在android中有两种context,
一种是 application context,
一种是activity context,通常我们在各种类和方法间传递的是activity context。
比如一个activity的onCreate:
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = newTextView(this); //传递context给view control label.setText("Leaks are bad"); setContentView(label);
}
把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity占有的资源:view hierachy,resource等。
这样如果context发生内存泄露的话,就会泄露很多内存。 这里泄露的意思是gc没有办法回收activity的内存。 Leaking an entire activity是很容易的一件事。 当屏幕旋转的时候,系统会销毁当前的activity,保存状态信息,再创建一个新的。 比如我们写了一个应用程序,它需要加载一个很大的图片,我们不希望每次旋转屏 幕的时候都销毁这个图片,重新加载。实现这个要求的简单想法就是定义一个静态的Drawable,这样Activity 类创建销毁它始终保存在内存中。 实现类似: public class myactivity extends Activity { private static Drawable sBackground; protected voidonCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground);//drawable attached to a view setContentView(label); } }
这段程序看起来很简单,但是却问题很大。当屏幕旋转的时候会有leak(即gc没法销毁activity)。 我们刚才说过,屏幕旋转的时候系统会销毁当前的activity。但是当drawable和view关联后,drawable保存了view的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能销毁,它所引用和间接引用的都不能销毁,这样系统就没有办法销毁当前的activity,于是造成了内存泄露。gc对这种类型的内存泄露是无能为力的。 避免这种内存泄露的方法是避免activity中的任何对象的生命周期长过activity,避免由于对象对 activity的引用导致activity不能正常被销毁,我们可以使用application context。
application context伴随application的一生,与activity的生命周期无关。
application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取。 避免context相关的内存泄露,记住以下几点:
(1). 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
(2). 对于生命周期长的对象,可以使用application context
(3). 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
20.SP是进程同步吗?有什么办法可以让他同步?
1. SharedPreferences不支持进程同步
一个进程的情况,经常采用SharePreference来做,但是SharePreference不支持多进程,它基于单个文件的,默认是没有考虑同步互斥,而且,APP对SP对象做了缓存,不好互斥同步.
MODE_MULTI_PROCESS的作用是什么?
在getSharedPreferences的时候, 会强制让SP进行一次读取操作,从而保证数据是最新的. 但是若频繁多进程进行读写 . 若某个进程持有了一个外部sp对象, 那么不能保证数据是最新的. 因为刚刚被别的进程更新了.
2.考虑用ContentProvider来实现SharedPreferences的进程同步.
ContentProvider基于Binder,不存在进程间互斥问题,对于同步,也做了很好的封装,不需要开发者额外实现。
另外ContentProvider的每次操作都会重新getSP. 保证了sp的一致性.
21.Android中多线程的使用?
https://blog.csdn.net/a992036795/article/details/51362487
22.进程和应用的生命周期?
https://blog.csdn.net/timshinlee/article/details/73770821
23.RecycleView原理
https://blog.csdn.net/xyh269/article/details/53047855
24.AndroidMainfest的作用与理解
https://www.cnblogs.com/-OYK/archive/2011/05/31/2064818.html
更多相关文章
- Android(安卓)application对象的使用 全局变量
- Android中sqllite存储海量数据解决办法
- Android的蓝牙串口(Bluetooth SPP)使用
- Android(安卓)SQLiteOpenHelper的使用心得
- Android写入配置信息
- Android页面之间进行数据回传
- Android之数据存储笔记
- android开发学习笔记(一)分别通过GET和POST请求从服务器端获取数
- Android联系人自动过滤并显示“新建联系人”