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)