android面试题

1. Activity和fragment的生命周期

  1. Activity从onCreate→onStart→onResume→onPause→onStop→onDestroy,其中oncreate初始化加载布局资源,onStart布局可见但是还在后台不可交互

    onResume布局可见在前台可以交互。onPause正在停止当前activity,onStop表示activity即将停止,做一些回收资源操作,onDestroy销毁activity最终的资源释放。总结:onStart和onPause可见不可见,onResume和onStop可不可以交互

  2. Fragment从onAttach→onCreate→onCreateView→onStart→onResume→onPause→onStop→onDestroyView→onDestroy-onDetach

2. Layout_gravity和gravity的区别。

比如设置android:layout_gravity=”right”的button会显示在父view的最右边。所以layout_gravity是设置当前view在父view的位置。

比如设置了android:gravity=”left”的LinearLayout会让里面的子View最显示在最左边。所以gravity是设置当前view里面的子view的位置。

3. 当一个activity跳转到另一个activity的生命周期

我们分别用AB代替两个activity

onPause(A)→onCreate(B)→onStart(B)→onResume(B)→onStop(A)

4.简单介绍Handler Message MessageQueue Looper

当Handler调用sendMessage方法会先把调用MessageQueue.enqeueMessage把Message加到消息队列,然后Looper开启循环不断遍历消息队列,调用MessageQueue.next获取message,然后调用目标Handler的dispatchMessage,判断Message有没有Callback即有没有Runnable对象,再判断Handler有没有callback,如果都没最后输出到Handler的handleMessage方法来处理消息。

5. 内存溢出和内存泄露

oom又叫out of memory 就是内存溢出。就是对象需求的内存大于jvm可用内存,避免oom要

减小对象内存的使用

1)使用更加轻量的数据结构,使用ArrayMap/SparseArray代替HashMap

2)避免使用Enum

3)减小bitmap对象的内存占用 使用insampleSize缩放比例,设置decodeFormat,解码格式

4)使用更小的图片,用tinypng压缩图片

内存对象的重复使用。使用对象池

1)StringBuilder减少String对象创建

2)避免在onDraw创建对象,因为onDraw会频繁调用,频繁gc,从而造成内存抖动。

3)复用系统提供的资源,比如字符串 颜色 图片 动画 样式 和布局

4)在listview或者gridview对convertView的复用

5)bitmap对象的复用在api11-18使用inbitmap,确定具有相同的解码模式,第二张图片会使用第一张照片已存在的位置

避免内存泄露

1)注意Activity的泄漏,一般是内部类引用导致activity泄露比如handler

2)Activity Context被传到其他实例中,这可能导致自身引用发生泄漏

3)考虑使用Application Context 而不是Activity Context当然dialog就必须是activity的content

4)注意临时的bitmap对象的回收 调用bitmap.recycle()

5) 监听器的注销要手动unregister 比如realm的list监听器

6)注意缓存容器中的对象泄漏比如2.3版本的drawable会对view强引用,

7)注意webview的泄露

8)还有Cursor游标的关闭。

6. Jvm的堆栈方法区

堆区存放所有的对象,只有一个,每个对象都包含一个与之对应的class信息class的目的是得到操作指令,但是不包括基本类型和对象引用,new一个类就是对象引用。只存放对象本身。

栈区 每个线程都有一个栈区,用来存放对象的引用和基本类型,(怎么区分对象和对象的应用呢 举个例子 Person person=new Person(); =左边是对象的引用,=右边是对象),其他栈不能访问另外一个栈的内容

方法区,就是静态变量static修饰的变量,常量。