在 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 如: public classCombankDroid extendsApplication {
private booleanisLogin;
public booleanisLogin(){
returnisLogin
}
public voidsetIsLogin( booleanb){
isLogin isLogin = b;
}
}
(3)在Activity中使用,通过 Application 类实例,再通过该类中的方法获取相关数据 获取 在Service 和 Activity 中获取 Application 的三种方法: 1> getApplication() :如 CombankDroid combankDroid=((CombankDroid)getApplication()) 2> getApplicationContext(): 如 CombankDroid combankDroid=((CombankDroid)getApplicationContext()) 3> getApplicationInstance(): 如 CombankDroidcombankDroid=CombankDroid.getApplicationInstance() 注:getApplicationInstance()用在获取不到context对象的类中 4> 将要操作的属性设为静态方法就可以直接调用 如:MyApplication.info.getUserName() 如: classAnyhow extendsActivity {
@Override public voidonCreate(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)同样适用

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. android 面试(一)
  4. Android开发之多线程处理、Handler详解
  5. android从一个app点击启动或者唤醒另一个app
  6. Android(安卓)studio中接收蓝牙模块传输回来的数据
  7. android用Intent传输自定对象数组(Parcelable[])失败
  8. 在android中使用文件进行数据存储
  9. Android(安卓)Binder框架实现之Parcel详解之read/writeStrongBin

随机推荐

  1. android 应用移植到ophone 平台需注意
  2. 设置TextView文字居中
  3. Android 音视频汇总
  4. Android内嵌H5(1)
  5. Android学习笔记(2)---android字体风格设置
  6. 关于linearLayout的中 android:layout_we
  7. Android中Activity启动模式详解
  8. listview android:cacheColorHint,androi
  9. android的一些常用属性的说明
  10. gravity 和 layout_grativy 区别