Android中在Activity之间传递数据的另一种方法, 使用application context

在Android中程序的开发都知道。在Activity、等件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用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: 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());

  上面两段代可以在任何的、Activity中使用。

Android中在不同Activity中传递变量,通常使用Intent中Bundle添加量的操作方法。

   Intent intent = new Intent();
  intent.setClass(A.this, B.class);
  Bundle bundle = new Bundle();
  bundle.putString("Info""Information");
  intent.putExtras(bundle);
  startActivity(intent);
 
  不在多个Activity中常使用同一,使用BundleActivity都需要置一次。

  如想在整个用中使用,在java中一般是使用静态变量,而在android中有个更雅的方式是使用Application context。

  新建一个承自Application

  class MyApp extends
  Application {
  private String myState;
  public String getState() {
  return myState;
  }
  public void setState(String s) {
  myState = s;
  }
  }

  在AndroidManifest.xml的application加个name属性就可以了,如下面所示:

   android:name=".MyApp" android:icon="@drawable/icon"
  android:label="@string/app_name">
  使用时:

  class Blah extends

  Activity {

  @Override

  public void onCreate(Bundle b){

  ...

  MyApp appState = ((MyApp)getApplicationContext());

  String state = appState.getState();

  ...

  }

  }

  英文引用:http://stackoverflow.com/questions/708012/android-how-to-declare- global-variables

  The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.

  --如想在整个用中使用,在java中一般是使用静态变量,而在android中有个更雅的方式是使用Application context。

  As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.

  --Activity 都是Context,其包含了其运行的一些状android保了其是single instance的。

  The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):

  --方法是建一个属于你自己的android.app.Application的子,然后在manifest中申明一下 android就此建立一个全局可用的例,你可以在其他任何地方使用Context.getApplicationContext()方法例,取其中的状()。


转自:http://www.cnblogs.com/javastorm/archive/2012/04/10/2440035.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值