在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。
);
     startActivity(intent);

这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:

    public  class  Product  extends  Activity
   {
         public  static  Bitmap mBitmap;
        
   }

对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。

注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,

ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。

那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。

package  net.blogjava.mobile1;

import  android.app.Application;
import  android.graphics.Bitmap;

public  class  MyApp  extends  Application
{
     private  Bitmap mBitmap;

public  Bitmap getBitmap()
    {
         return  mBitmap;
    }

public  void  setBitmap(Bitmap bitmap)
    {
         this .mBitmap  =  bitmap;
    }
    
}

上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在<application>标签中使用android:name属性来指定这个类,代码如 下:

< application  android:name =".MyApp"  android:icon ="@drawable/icon"  android:label ="@string/app_name" >

</ application?

接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:

    MyApp myApp  =  (MyApp)getApplication();
        
    Bitmap bitmap  =  BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
        
    myApp.setBitmap(bitmap);

获得Bitmap对象的代码:

    ImageView imageview  =  (ImageView)findViewById(R.id.ivImageView);
        
    MyApp myApp  =  (MyApp)getApplication();
        
    imageview.setImageBitmap(myApp.getBitmap());

上面两段代码可以在任何的Service、Activity中使用。全局的,哈哈。

via: http://blog.csdn.net/nokiaguy/article/details/5998986

最新文章

  1. java sound初探
  2. iotop命令
  3. [笔记]Modelsim系列01:编译Altera库的方法
  4. iOS证书失效
  5. UVA11538 - Chess Queen(数学组合)
  6. hibernate对象关系实现(一)一对多
  7. asp连接SQL数据库的代码
  8. EL表达式中如何截取字符串
  9. JAVA Metrics 度量工具使用介绍1
  10. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库
  11. ehcache模糊批量移除缓存
  12. JavaScript继承总结
  13. 检查linux版本命令
  14. idea首次创建新模块的详细操作
  15. 高性能NIO框架Netty-对象传输
  16. [UE4]GameplayAbilities,技能系统插件
  17. js 按指定属性给对象数组排序(json数组)
  18. AIX 7命令行weblogic建域流水
  19. svn检出项目,Project *** is already imported into workspace
  20. 在 HTTP Request 中加入特定的 Header

热门文章

  1. PHP 设计模式 单例模式 工厂模式 注册模式
  2. iOS 远程推送注册的小问题
  3. HDU 1875 畅通工程再续 最小生成树问题
  4. CTSC/APIO2018滚粗记
  5. Anaconda+django写出第一个web app(七)
  6. rstful登陆认证并检查session是否过期
  7. 联通-长春处,FDD和TDD宏站,数据业务接入时延期望值默认值应为80ms
  8. (windows下)安装mysql
  9. Jmeter之逻辑控制器(Logic Controller)【转】
  10. Kotlin 语言下设计模式的不同实现