androidApplicationandroid 集结号

android-application学习

2015-05-03  本文已影响929人  肉团先生

Application是单例模式的类,android系统为每个应用程序创建一个Application类的对象且只创建一个
启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行
Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期
Application全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象

实现步骤:

1.继承Application

        public class CustomApplication extends Application{
            @Override
            public void onCreate(){}
        }

继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点)
2.在AndroidManifest.xml文件中配置自定义的Application

        <application
                android:name="CustomApplication">
        </application>
  1. 如何获得Application的信息(全局变量)呢?

           public class FirstActivity extends Activity{
               private CustomApplication app;
               @Override
               public void onCreate(Bundle savedInstanceState){
                   .....
                   app = (CustomApplication) getApplication(); // 获得CustomApplication对象
                   Log.i("FirstActivity", "初始值=====" + app.getValue()); // 获取进程中的全局变量值,看是否是初始化值
                   app.setValue("Harvey Ren"); // 重新设置值
                   Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次获取进程中的全局变量值,看是否被修改
               }
           }
    

只需要调用ContextgetApplicationContext或者Activity的getApplication方法获得一个Application对象,然后再得到相应的成员变量即可。

MemoryLeak
在Java中内存泄漏是指:某个(某些)对象已经不在被使用应该被gc所回收,但有一个对象持有这个对象的引用而阻止这个对象被回收。比如我们通常会这样创建一个View TextView tv = new TextView(this);这里的this通常都是Activity。所以这个TextView就持有着这个Activity的引用
通常情况下,当用户转动手机的时候,android会重新调用OnCreate()方法生成一个新的Activity,原来的 Activity应该被GC所回收。但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个 View的引用放到了Application当中),这时候原来的Activity将不能被GC所回收Activity本身又持有很多对象的引用,所以 整个Activity的内存被泄漏了。

备注:经常导致内存泄漏核心原因:
keeping a long-lived reference to a Context.持有一个context的对象,从而gc不能回收。

- 1.**一个View的作用域超出了所在的Activity的作用域**,比如一个static的View或者把一个View cache到了application当中 etc

理解:内存:注意静态的数据和缓存中的数据;注意释放;
- 2.某些与View关联的Drawable的作用域超出了Activity的作用域
- 3.Runnable对象:比如在一个Activity中启用了一个新线程去执行一个任务,在这期间这个Activity被系统回收了, 但Runnalbe的 任务还没有执行完毕并持有Activity的引用而泄漏但这种泄漏一般来泄漏一段时间,只有Runnalbe的线程执行完闭,这个 Activity又可以被正常回收了
- 4.内存类的对象作用域超出Activity的范围:比如定义了一个内存类来存储数据,又把这个内存类的对象传给了其它Activity 或者Service等。因为内部类的对象会持有当前类的引用,所以也就持有了Context的引用解决方法是如果不需要当前的引用把内部类写成static或者,把内部类抽取出来变成一个单独的类,或者把避免内部对象作用域超出Activity的作用域
out Of Memery Error 在android中每一个程序所分到的内存大小是有限的,如果超过了这个数就会报Out Of Memory Error
- 注意:所以尽量把程序中的一些大的数据cache到本地文件。以免内存使用量超标。记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏。

Android中Application类用法
android application 详解--深入浅出,讲解完整的Application,以及所涉及到的扩展知识。
Android笔记 Application对象的使用-数据传递以及内存泄漏问题

上一篇下一篇

猜你喜欢

热点阅读