Android Application详解

在 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 class CombankDroid  extends Application {
private boolean isLogin;
public boolean isLogin(){
return isLogin
}

public void 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
public void 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值