Android笔记三.不同Activity之间的传递数据(Bundle对象的使用)

不同Activity之间的传递数据

转载请表明出处:http://blog.csdn.net/u012637501 (嵌入式_小J的天空)

一、API类说明

1.Bundle类-实现数据传递

(1)简介

    Bundle对象用于不同Activity之间的数据传递。对于不同Actvity而言,Bundle对象就相当于一个数据包,Intent对象就充当搬运工

首先,创建一个Bundle对象bundle并调用其成员方法PutString或者putInt或者putDouble等方法,将要传递的数据赋值给指定的变量(键值)再将他们压入bundle对象中,即“制作数据包”;

然后,把已经制作好的"数据包"(即Bundle对象),通过Intent对应Extras属性的putExtras方法,将Bundle对象(数据包)交给Intent对象(搬运工)。"意图"在启动Activity后,会将这个Bundle对象作为参数传递给被启动的Activity.

最后,在被启动的Activity中接收到通过Intent对象传递过来的数据包(Bundle对象),但是如果要想使用数据包里的数据,需要将这个数据包(Bundle对象)从intent分离(Bundlebundle1=this.getIntent().getExtras();),得到bundle对象后,我们再使用Bundle成员方法getString或者getDouble等,从数据包(Bundle对象)中获取里面的变量,再将其值作为返回的结果。经过压缩数据包-传递-解压数据包,最终获取传递的数据。

(2)构造函数

Bundle()
Constructs a new, empty Bundle.

Bundle( ClassLoader loader)
Constructs a new, empty Bundle that uses a specific ClassLoader for instantiating Parcelable and Serializable objects.
Bundle(int capacity)
Constructs a new, empty Bundle sized to hold the given number of elements.
Bundle( Bundle b)
创建一个新的Bundle对象,这个Bundle对象从给定的Bundle对象复制而来
Bundle( PersistableBundle b)
Constructs a Bundle containing a copy of the mappings from the given PersistableBundle.

(3)重要方法

    clear():清除此Bundle映射中的所有保存的数据。

    clone():克隆当前Bundle

    containsKey(String key):返回指定key的值

    getString(String key):返回指定key(变量)的字符

    hasFileDescriptors():指示是否包含任何捆绑打包文件描述符

    isEmpty():如果这个捆绑映射为空,则返回true

    putString(String key, String value):插入一个给定key的字符串值

    readFromParcel(Parcel parcel):读取这个parcel的内容

    remove(String key):移除指定key的值

    writeToParcel(Parcel parcel, int flags):写入这个parcel的内容

2.Intent类

static  Intent getIntent() 获取intent对象   
Intent putExtras( Bundle extras)
将数据包(Bundle对象)压入Intent对象中
Bundle getExtras()
从intent对象的extras属性中,获取被传递的数据包(Bundle对象)

二、不同Activity数据传递开发基本思想

在Android开发中,如果要通过一个Activity启动另外一个Activity,需要调用startActivity()函数,这个函数的参数是一个Intent对象,这个对象通常的初始化方式如下:

Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
startActivity(intent);
这样就完成了一个新的Activity的启动,但是这种启动方式两个Activity之间不会有任何的数据传递,很多情况下,我们遇到的往往是前一个Activity要把数据传递给新启动的Activity,这就要用到Bundle对象了。
比如在第一个Activity中,我们获取了身高和性别两种数据,需要传递给新启动的Activity,那么就要把这些数据封装进Bundle对象里面,再把Bundle对象assign给Intent,作为starActivity()函数的参数。
实现代码如下:

Intentintent=newIntent();
intent.setClass(this,SecondActivity.class);
//封装Bundle对象
Bundlebundle=newBundle();
bundle.putDouble("height",height);//压入数据,height为double型变量
bundle.putString("sex",sex);//压入数据,sex为string型变量
//把Bundle对象assign给Intent
intent.putExtras(bundle);
startActivity(intent);

第二个Activity相应的也要接收数据,方法也很简单,先从Intent对象中分离Bundle,再按照相同方法提取数据。
实现代码如下:

Bundlebundle1=this.getIntent().getExtras();
Stringsex=bundle1.getString("sex");//从变量sex中读取数据,将返回字符串赋值给sex
doubleheight=bundle1.getDouble("height");//从变量sex中读取数据
值得注意的是,如果程序中有多个Activity,要在AndroidManifest.xml中声明,声明一个Activity格式如下:

<activityandroid:name="SecondActivity"></activity>

三、源代码实例

   BundleDemo.java

  1. public class BundleDemo extends Activity {  
  2.     private EditText etName;  
  3.     Button btn;  
  4.   
  5.     /* 
  6.     * (non-Javadoc) 
  7.     * @see android.app.Activity#onCreate(android.os.Bundle) 
  8.     */  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.bundle);  
  14.           
  15.         etName = (EditText) findViewById(R.id.etname);  
  16.         btn = (Button) findViewById(R.id.btn);  
  17.           
  18.         btn.setOnClickListener(new OnClickListener() {  
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 String info = etName.getText().toString();  
  22.                 Bundle bundle = new Bundle();  
  23.   
  24.                   //保存输入的信息  
  25.                 bundle.putString("name", info);  
  26.                 Intent intent=new Intent(BundleDemo.this,BundleDemo1.class);  
  27.                 intent.putExtras(bundle);  
  28.                 finish();  
  29.                 startActivity(intent);  
  30.             }  
  31.         });  
  32.     }  
  33. }  

  BundleDemo1.java

  1. public class BundleDemo1 extends Activity {  
  2.     private TextView etName;  
  3.     /* (non-Javadoc) 
  4.     * @see android.app.Activity#onCreate(android.os.Bundle) 
  5.     */  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         // TODO Auto-generated method stub  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.b1);  
  11.   
  12.         etName=(TextView)findViewById(R.id.txtname);  
  13.         Bundle b=getIntent().getExtras();  
  14.         //获取Bundle的信息  
  15.         String info=b.getString("name");  
  16.         etName.setText("您的姓名:"+info);  
  17.     }  
  18. }  

参考:http://txlong-onz.iteye.com/blog/934960
     http://www.shunix.com/bundle-usage-642/
     http://developer.android.com/reference/android/os/Bundle.html

你可能感兴趣的:(Android开发,应用程序)