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

Intent intent = new Intent(this, Test.class);     intent.putExtra("param1", "data1");     intent.putExtra("intParam1", 20);     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:bitmapsize exceeds VMbudget

如果不使用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。下面还需要一个重要的步骤,就是在标签中使用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中使用。全局的。

原作者:李宁

原文链接:http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html

更多相关文章

  1. Android(安卓)解析json对象,存放到List中
  2. android之应用程序LED
  3. 如何在Linux平台下安装JDK
  4. Android自动化工具Monkeyrunner使用(二)
  5. android中bitmap和drawable之间的转换
  6. 不要在Android的Application对象中缓存数据!
  7. Android中webview和js之间的交互及注意事项
  8. Android(安卓)编程常见问题解答
  9. Android通过Intent发送电子邮件含附件

随机推荐

  1. 【Android(安卓)Studio使用教程2】Androi
  2. Android(安卓)Studio设置国内镜像网站
  3. Android(安卓)系统framework 概述
  4. Android有用代码片断(六)
  5. android:关于主工程和library project
  6. android EditText中inputType的属性列表
  7. android线性布局之比例
  8. Android(安卓)TextView内容过长加省略号
  9. android的adb常用命令使用
  10. Android(安卓)XML 绘图