1. Activity和fragment的生命周期
-
Activity从onCreate→onStart→onResume→onPause→onStop→onDestroy,其中oncreate初始化加载布局资源,onStart布局可见但是还在后台不可交互
onResume布局可见在前台可以交互。onPause正在停止当前activity,onStop表示activity即将停止,做一些回收资源操作,onDestroy销毁activity最终的资源释放。总结:onStart和onPause可见不可见,onResume和onStop可不可以交互
-
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修饰的变量,常量。