Android面试题总结一

2017-05-28  本文已影响146人  谢尔顿

1.Dalvik和Sun JVM

共同点

2.IPC进程间通信

在一个应用中存在多个进程的情况(不讨论两个应用之间的多进程情况),开启多进程:在Android的manifests文件中指定android:process属性,除此之外没有其他办法。
进程名:以“:“开头的进程属于当前应用的私有进程,其他的应用不可以和它跑在同一个进程中,而进程名不以”:“开头的属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中。Android给每一个进程都分配一个独立的虚拟机,所以运行在不同进程中的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。
使用多进程会造成问题:

3.Intent传递数据

根据API文档,Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递 Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。

4.数据存储

Android数据存储方式:

内部存储

写数据:
通过context.openFileOutput(文件名,读写文件的方式)的到一个文件输出流;
调用文件输出流的write方法将文本信息写到手机内存中;
读数据:
通过context.openFileInput(文件名)获取一个输入流;
获取一个字节数组输出流,和实例化一个字节数组;
从输入流中读取数据写入到内存流中,最后调用内存流的toString方法将数据输出;

外部存储

写数据:
读写外部数据时需要设置权限;
写数据之前首先要判断SDCard的状态,Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
获取sdcard的根路径rootPath,Environment.getExternalStorageDirectory();
创建要写入的sdcard的文件file,new File(sdcard的根路径,文件名);
创建文件输出流fos,参数为上步的file;
调用fos的write方法,将内容写入输出流中;
读数据:
第1、2、3步同写数据的,
获取要读取的文件file,new File(rootPath.getAbsolutePath()+"/"+文件名);
调用file的exists方法判断文件是否存在;
创建一个文件输入流fis,参数为上步的file;
创建一个字节数组输出流(内存流),和一个自己数组;
将读取输入流中内容写入到字节数组输出流中,最后通过内存流的to;

5.Android动画

  • View动画:
    View动画注意事项:View动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一 个Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点 击屏幕下方动画执行之后的Button是没有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。
    View动画有四种变换效果,对应Animation的四个子类:TranslateAnimation(平移),ScaleAnimation(缩放),AlphaAnimation(透明度动画),RotateAnimation(旋转),一般采用XML的方式来定义动画,可读性更好。

6.Bitmap加载

Bitmap代表一张图片,BitmapFactory提供了四类方法:decodeFile,decodeResource,decodeStream和 decodeByteArray加载bitmap。

7.Retrofit优点

  • 采用动态代理机制和反射,使代码写起来特别简单,看起来也很清晰。

8.RequestLayout,invalidate和postInvalidate

  • requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure,onLayout来对重新设置自己位置。
    特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。

9.Rxjava

一个词:异步。
RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。
在 RxJava 的默认规则中,事件的发出和消费都是在同一个线程的。在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (调度器)。
RxJava 的异步实现,是通过一种扩展的观察者模式来实现的
变换(map(),flatmap()):
Map行为:

10.Glide优点

  • 默认Bitmap格式是RGB_565,内存占用更少,原因在于Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小。

11.Material Design

  • TextInputLayout必须把EditText包含起来,不能单独使用。
<android.support.design.widget.TextInputLayout
        android:id="@+id/til_pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</android.support.design.widget.TextInputLayout>
app:headerLayout="@layout/navigation_header"
        app:menu="@menu/drawer_view"

12.SQLite

public long insert (String table, String nullColumnHack, ContentValues values) 插入数据参数介绍 :

13.HttpURLConnection

设置请求头或响应头
HTTP请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作的方法:

14.Json

一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
优点:

15.Parcelable和Serializable

  • 作用:
    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。简单易用,这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
    而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

16.Android 四大组件

Lemon_95的Android 四大组件

17.Application context和Activity context的区别有哪些?

(1)Application的context是一个全局静态变量,官方文档表明,只有当你引用这个context的生命周期超过了当前activity的生命周期,而和整个应用的生命周期挂钩时,才会使用Application的context;
注:一种推荐的用法就是应用程序注册广播broadcast时,使用这个context。
(2)引用Application context不会导致内存泄漏,引用activity的context才会导致内存泄漏,当你的引用对象的生命周期超过了当前activity的生命周期时,系统回收你的activity时发现还有一个context的强引用,而不去销毁这个activity,导致内存泄漏;
注:在开发过程中,需要非常重视这一点,一个全距静态变量在引用context时一定要使用application的context而不使用activity的;
(3)避免context相关的内存泄漏:
不要让比Activity声明周期长的对象引用Activity context,即保证引用activity的对象要与activity本身生命周期是一样的;
对于生命周期长的对象可以使用Application context,
避免非静态的内部类,尽量使用静态类,避免声明周期问题,注意内部类对外部对象的引用导致的生命周期变化。

18.请分析一张400*500尺寸的PNG图片加载到程序中占用内存中的大小?

一张图片占用的内存=图片长度 x 图片宽度 x 单位像素占用的字节数;
注:图片长度和宽度的单位是像素;
创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPrefenredConfig变量决定,inPreferredConfig为Bitmap.Config类型,(Bitmap.Config类是个枚举类型),其取值如下图所示:


在Android4.0之前,Bitmap的内存是分配在Native堆中,调用recycle可以立即释放Native内存;
在Android4.0开始,Bitmap的内存是分配在dalvik堆中,即java堆中的。

19.xml三种解析方式的区别sax、pull、dom,官方推荐哪种?]

(1)解析XML:

上一篇 下一篇

猜你喜欢

热点阅读