Android优化详解--For面试

来源:互联网 发布:国家网络问政平台官网 编辑:程序博客网 时间:2024/06/06 03:38

为了能够在找实习的过程中不被打垮,所以需要系统的对只是梳理一遍。看自己时间能够坚持到什么时候吧。

一、Android系统架构详解

1、软件层次分为4层

操作系统层(OS):Linux2.6内核操作系统为基础。

各种库(Libraries)和运行环境(RunTime)

应用程序(Application):用户界面方面

应用程序框架(Application FrameWork):为应用程序层的开发提供APIs,提供各种控件。应用程序框架有以下5部分: Activity,Broadcast Intent Receiver,Service,Content Provider和Intent and Intent Filter.

2、应用程序的生命周期

A、进程的类型:前台进程(Foreground),可见进程(Visible),服务进程(Service),后台进程(Background),空进程(Empty)

B、Activity的状态是由Android内存管理器决定的,Android会首先关闭那些包含 Inactive Activity的应用程序,在关闭Stopped的,极端情况下会移除Paused状态的

二、Android优化综述

1、用户体验很关键

影响用户体验的因素:使用者的状态,系统系能和环境状况

2、UI布局优化

A、LinearLayout支持为单独的子元素指定weight,默认值为0,假设三个文本框,其中两个指定的weight值为1,那么这两个文本框将等比例的放大填满剩余空间,而第三个文本框不会放大。

框架布局FrameLayout里面智能填充一个单一对象,默认的所有子元素固定在屏幕的左上角,多个的话,后一个会对前一个进行覆盖

B、Android Layout有四个标签,<viewStub/>,<requestFocus>,<merge/>和<include/>.

  1. 当LayoutInflater遇到<merge/>标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。
    <merge/>只能作为XML布局的根标签使用,只能替换<FrameLayout/>
    当Inflate以<merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。参看LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)。 

     
  2.  include标签内不能设置RelativeLayout属性,如android:layout_alignParentBottom,因为不起作用
    include标签内设置id属性后(android:id),其引用的布局layout内的id属性就不起作用了,怀疑是其引用的layout外层包裹了一层include标签或者是覆盖了其内的属性id
    如果没有include标签,所有布局代码都写在一个xml文件中,界面会显得很冗余,可读性很差。而且界面加载的时候是按照顺序加载的,前面的布局不能调用其后面的布局id。而采用include后,一个include中可以引用其后的include中的布局id属性
   3. request focus把输入焦点放在调用这个方法的控件上。

4.http://www.cnblogs.com/lwbqqyumidi/p/4047108.html 讲解<viewStub/>

C、进行Layout布局时,必须注意下面4点:

(1)如果可能,尽量不要使用LinearLayout而使用RelativeLayout代替,因为 android:layout_alignWithParentIfMissing只对RelativeLayout有用,如果那个视图设置为gone,这个属性将按照父视图进行调整

(2)在使用Adapter控件时,例如list,如果布局递归太深,则会严重影响性能

(3)对于TextView和ImageView组成的Layout来说,可以直接使用TextView替换

(4)用merge

D、优化Bitmap图片

使用BitmapFactory.Options设置isSampleSize

三、内存管理

1、后台耗电的是带服务的应用

2、Android系统采用Binder通信机制,有一系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序。核心组件是Binder驱动程序,service Manager提供了辅助管理的功能,Client和Server正式在Binder驱动和Service Manager提供的基础设施上,进行Client/Server之间的通信。、

这一部分主要讲binder机智如何与红黑树存储。没看明白,待研究。

3、Android中的垃圾回收

sp和wp是智能指针,实现垃圾回收功能的接口,sp是strong pointer,wp是weak pointer。强指针通过引用技术来记录有多少使用者在使用一个对象,如果所有引用者都放弃了对该对象的引用,则该对象自动销毁。Java程序的内存都是由JVM控制的,其分配和回收是JRE在后台自动进行的,JRE负责内存回收机制,即(Grabage Collection,即GC)

4、查看内存的方法

DDMS,手机上的running Service,ActivityManager的getMemoryInfo,Debug的getMemoryInfo(),Debug的getNativeHeapSize(),getNativeHeapAllocatedSize(),在adb shell中运行,dumpsys meminfo命令、procrank命令, cat/proc/meminfo命令。

5、Android内存泄露

内存泄露指犹豫疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄露是指应用程序分配某段内存后,犹豫设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成内存的浪费。GC发现通过任何reference chain 无法访问某个对象的时候,该对象即被回收。

Android为应用进程分配的内存是有上限的。

6、查看Android内存泄露的方法

利用DDMS的MAT插件。可以生成.hprof文件,也可以使用MAT导入.hprof文件,也可以使用MAT视图工具分析内存,

7、引起内存泄露的方法

A、查询数据库时忘记关闭游标

B、构造Adapter时不习惯使用缓存的convertView

C、没有 及时释放对象的引用 当一个生命周期较短的对象A,被一个生命周期较长的B保有其引用的情况下,在A的生命周期结束时,要及时在B中清除掉对A的引用

D、不在使用Bitmap对象时调用recycle()释放内存


其他比较基础的情况,就是在Activity的生命周期中,在onPause(),onStop(),onDestroy()方法中需要释放内存


四、Android代码优化的基本原则

1、优化的基本原则

(1)字符串频繁操作的时候,多用StringBuffer而少用String

(2)尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量

(3)String方法中的subString和indexOf都是Native方法,可以大量使用

(4)如果函数返回了String类型,而且返回后的使用就是要加入到StringBuffer,此时可以直接传入StringBuffer

(5)用两个一维数组代替二维数组,例如使用int[]int[]替换int[][],这两者是等价的

(6)如果返回直接类型足够了,就不应该返回接口类型,如返回HashMap就够了,请不要返回Map

(7)如果一个方法不访问(不修改)成员变量,请用static方法。

(8)尽量不用getters和setters,如果非要用的话请加上final关键字,编译器会把它当成内联函数

(9)永远不要在for循环的第二个参数中使用方法调用

(10)不修改的static变量,请用static final常量代替

(11)慎用浮点数

(12)不使用的引用变量要手动置null,提高内存被回收的概率

(13)慎用图片操作,使用后释放资源

(14)少用new创建对象 用clone()

(12)及时清除session

(13)用位移来做乘法和除法



0 0
原创粉丝点击