1、 合理使用Service:
使用Service执行任务,在任务执行完去停止Service的时候,应当注意Service停止失败导致内存泄漏。
当我们启动一个Service的时候,系统会倾向于将这个Service依赖的进程进行保留,这样会导致这个进程非常消耗内存。Google推荐使用IntentService,这种Service特点是任务执行完后会自动的停止。
2、 界面不可见时释放内存
当用户打开另一个程序时,我们的程序界面已经不可见,应当将和界面相关的资源进行释放,只需要在Activity中重写onTrimMemory方法,然后在在这方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,当触发这个级别时,说明用户离开了我们的程序,这是就可以进行资源的释放。
3、使用优化过的数据集合
Android API中提供了优化过后的数据集合工具类,如SparseArray、SparseBooleanArray以及LongSparseArray等。
SparseArray值稀疏数组:所谓稀疏数组就是数组中大部分内容的值都未被使用(或者为零),在数组仅有少部分的控件使用,因此造成内存控件浪费,为了节省内存控件,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。
SparseArray是android里为 《Integer,Object》 这样的HashMap而专门写的类,目的是提高效率。
3、 反抽象编程理念
在面向对象的世界里,使用抽象编程是一种被崇尚的编程习惯,使用抽象编程在代码维护和可扩张性方面会提高很多。在服务器端通过使用抽象编程,以牺牲内存,来获得更好的维护和扩展是值得的。但是在Android上使用抽象会带来额外的内存开支,因为抽象的编程方法需要编写额外的代码,虽然这些代码执行不到,但是也要映射到内存当中,不仅占用更多的内存,在执行效率上也会有所下降。
所以,在Android中,一切以性能、高校为宗旨,不要滥用抽象编程。如能使用ArrayList达到效果的,不使用List。
讲个笑话:谈恋爱时,两个人直接面对面谈,效率当然高过通过中介的介入,中介的介入必然带来额外的开销。
4、 避免使用依赖注入框架
使用依赖注入的框架,这些框架在搜索代码中的注解,通常需要经历较长的初始化过程,并且还可能会将一些用不到的对象一并加载到内存中,这些用不到的对象会一直占用着内存空间,可能要过很长时间才能得到释放。
5、 使用ProGuard混淆代码
ProGuard通常大家会认为是一个混淆代码的工具,但是除了混淆之外,还具有压缩和优化代码的功能,ProGuard会对我们的代码进行检索,删除一些无用的代码,并且会对原来类、字段、方法等进行重命名,重命名之后的类、字段、方法等比原来剪短很多,这样的话对内存的占用就会更少。
6、 使用多个进程
使用多个进程,其他进程不会占用当前进程的内存。