Android Application详解

来源:互联网 发布:淘宝鞋子质量好的店铺 编辑:程序博客网 时间:2024/05/18 06:23
在 Android 中使用全局变量,除 public 静态变量,还有就是使用 android.app.Application。Android系统 会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类所以在不同的Activity、Service中获得的对象都是同一个对象,所以通过 Application来进行一些,数据传递,数据共享等,数据缓存等操作。在启动 Application 时,系统会创建一个 PID,就是 进程ID,所有的 Activity 会在此进程上运行,在创建 Application 时初始化全局变量,同一个应用的所有 Activity 都会获取这些全局变量的值,可用于保存登录状态。Application中的全局变量值会在 Activity中被改变,其生命周期等于整个程序的生命周期
注:1> 在 Application 类中,其onCreate()方法,是Android应用程序真正的入口,将会会在所有 Activity,Service,Receiver组件之前调用
       2> 在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉
       3> 在组件之间传递信息:在自定义的 Application中设置成员变量这样在Activity、Service、Fragment等之间通过获取Application实例来访问其中成员变量
       4> 如果需要 cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在 Application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在,再从网络上获取
       5> 使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。如果在Application的oncreate中执行比较 耗时的操作,将直接影响的程序的启动时间。一些清理工作不能依靠 onTerminate 完成,因为 Android会尽量让程序一直运行,所以很有可能 onTerminate不会被调用

使用方式
(1)在AndroidManifest.xml中在<application>标签中添加android:name="...",其中设置 Applicationl类的
如:
<application
android:name=".CombankDroid"
android:icon="@drawable/first_aid"
android:label="@string/app_name" >
...
</application>

(2)创建 Application 类,该类继承于 android.app.Application
如:
publicclass CombankDroid extends Application {
privateboolean isLogin;
publicboolean isLogin(){
return isLogin
}

publicvoid setIsLogin(boolean b){
    isLogin
    isLogin = b;
}
}

(3)在Activity中使用,通过 Application 类实例,再通过该类中的方法获取相关数据
获取 在Service 和 Activity 中获取 Application 的三种方法:
        1> getApplication() : 如 CombankDroid combankDroid = ((CombankDroid)getApplication())
        2> getApplicationContext() : 如 CombankDroid combankDroid = ((CombankDroid)getApplicationContext())
        3> getApplicationInstance() : 如 CombankDroid combankDroid = CombankDroid.getApplicationInstance()
           注:getApplicationInstance()用在获取不到context对象的类中
        4> 将要操作的属性设为静态方法就可以直接调用 如:MyApplication.info.getUserName()
如:
class Anyhow extends Activity {
@Override
publicvoid onCreate(Bundle b){
...
CombankDroid combankDroid = ((CombankDroid)getApplicationContext());
if (!combankDroid.isLogin()) {
redirectToLoginActivity();
else {
loadUi();
}
...
}
...
}

Application中存储数据存在的问题
由于Application 对象不会一直呆着内存里面,它会被kill掉,比如启动 App后将数据存储在Application中点击 Home 键离开App几小时后,再返回App,此时实际上App不会重新启动,Android 系统会创建一个新的Application对象,然后再启动上次用户离开时的Activity以此造成App从来没有被Kill掉的假象,此时在获取Appication中的数据将会出现异常。针对这种问题,可根据情况采用其它的方式:
    1> 直接将数据通过intent传递给 Activity
    2> 使用官方推荐的几种方式将数据持久化到磁盘上
    3> 在使用Application中的数据时,总是要对变量的值进行非空检查
注:对 Application对象有用,对你app里面的单例对象(singleton)或者公共静态变量(public static)同样适用

0 0
原创粉丝点击