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

Intentintent = 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 BitmapmBitmap;

}


对于上面的代码来说,其他任何类可以直接使用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 BitmapmBitmap;

public BitmapgetBitmap()
{
return mBitmap;
}

public void setBitmap(Bitmapbitmap)
{
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对象的代码如下:

MyAppmyApp = (MyApp)getApplication();

Bitmapbitmap
= BitmapFactory.decodeResource( this .getResources(),R.drawable.icon);

myApp.setBitmap(bitmap);


获得Bitmap对象的代码:

ImageViewimageview = (ImageView)findViewById(R.id.ivImageView);

MyAppmyApp
= (MyApp)getApplication();

imageview.setImageBitmap(myApp.getBitmap());


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

更多相关文章

  1. google android最新源代码镜像(git.oschina.net)
  2. Android Studio使用Lint进行代码检查
  3. 初学Android做计时器和代码
  4. android 源代码构建和运行cts
  5. 实现TextView的垂直滚动以及通过代码设置TextView滚动无法显示滚
  6. Android Studio使用XML样式在JAVA代码中的使用(使用java代码调节x
  7. Android实现代码画虚线边框背景效果
  8. 一行代码搞定三级缓存

随机推荐

  1. 一条SQL语句在MySQL中是如何执行的
  2. 一次现场mysql重复记录数据的排查处理实
  3. MyBatis 动态SQL全面详解
  4. MySQL中datetime时间字段的四舍五入操作
  5. 浅谈MySQL表空间回收的正确姿势
  6. mysql如何能有效防止删库跑路
  7. 浅谈MySQL函数
  8. Mysql binlog日志文件过大的解决
  9. MySQL修炼之联结与集合浅析
  10. 如何利用MySQL的binlog恢复误删数据库详