《Android 应用案例开发大全(第二版)》——6.8节传递附加数据(Extra)

6.8 传递附加数据(Extra)
Android开发权威指南(第二版)
在显示窗口时通常可以使用如下两种方式向窗口传递数据。

通过Data传递数据。
通过putExtra传递附加数据。
第1种方法在前面已经多次使用过了,通过Data传递数据实际上就是通过Uri将数据传递给窗口。例如,传递电话号可以用“tel:12345678”。第1种方式虽然传递数据比较方便,但只能传递有限的数据,如果要传递的数据量比较大,而且数据类型比较多(如int、boolean、byte[]等类型),就要使用第2种方式传递附加数据。

Intent类有多个重载的putExtra方法,这些方法用于向Intent对象写入不同类型的数据,putExtra方法有两个参数,第1个参数是key,第2个参数是value。也就是putExtra方法会将一个key-value,类型的数据存入Intent对象,然后Intent.getXxxExtra方法可以通过key获取value。其中Xxx表示Int、Char、String等。例如,getIntExtra、getCharExtra和getStringExtra都是这种类型的方法。getXxxExtra方法也有两个参数1,第1个参数是key,第2个参数是defaultValue。当Intent对象中没有key时就返回defaultValue。

下面的代码使用putExtra方法写入了String、int和char类型的数据,并使用getXxxExtra方法获取了这些数据。

// 写入附加数据
Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("key1", 20);
intent.putExtra("key2", 'c');
intent.putExtra("key3","value");

// 读取附加数据
// 0是默认值
int n = intent.getIntExtra("key1", 0);
// 'c'是默认值
char c = intent.getCharExtra("key2", 'c');
String s = intent.getStringExtra("key3");
除了可以使用Intent.putExtra设置附加数据外,还可以使用Bundle对象设置完附加数据后,使用Intent.putExtras方法设置一个Bundle对象,代码如下:

// 写入附加数据
Intent intent = new Intent(this, MyActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("key1", 20);
bundle.putChar("key2", 'c');
bundle.putString("key3", "value");
intent.putExtras(bundle);

读取通过Bundle对象写入的数据时可以用Intent.getXxxExtra方法,也可以通过Intent.getExtras方法获取Bundle对象后,然后再通过Bundle.get或Bundle.getXxx方法(其中Xxx表示String、Int等字符串)获取相应的数据。其中Bundle.get方法只返回一个Object对象,可以封装任何类型的数据。而Bundle.getXxx方法通常有两个重载形式,一个没有默认值(只有一个参数用于传递key),另外一个有两个参数,一个是key,另一个是defaultValue。

实际上,Intent.putExtra和Bundle.putXxx方法本质上是一样的,如果不用Intent.putExtras方法设置Bundle对象,Intent会在内部创建一个新的Bundle对象。如果设置了Bundle对象,Intent就直接使用该Bundle对象。这一点从Intent.putExtra和Intent.putExtras方法的源代码就可以看出。

public Intent putExtra(String name, String value)
{
  if (mExtras == null)
{
    mExtras = new Bundle();
  }
  mExtras.putString(name, value)**;**
  return this;
}
public Intent putExtras(Bundle extras)
{
  if (mExtras == null)
  {
    mExtras = new Bundle();
  }
  // 将extras中的key-value对都添加到内部的Bundle对象中(mExtras)
    mExtras.putAll(extras);
  return this;
}

要注意的是,如果通过key获取的value的数据类型与返回值数据类型不同时,并不会进行类型转换,而会返回默认值,或返回null(对于字符串类型的value)。例如,下面的代码中尽管key存在,但由于类型不匹配,所以仍然返回int的默认值。

Intent intent = new Intent();
// value的数据类型是String
intent.putExtra("key", "40");
// n的值为120(默认值)
int n = intent.getIntExtra("key", 120);

1 getStringExtra方法是个例外,该方法只有一个参数,没有默认值。

时间: 2024-10-21 19:16:11

《Android 应用案例开发大全(第二版)》——6.8节传递附加数据(Extra)的相关文章

《Android 应用案例开发大全(第二版)》——1.6节本书案例项目的导入

1.6 本书案例项目的导入 Android 应用案例开发大全(第二版) 1.6.1 导入并运行Android程序 前面已经对手机如何与Eclipse连接进行了详细讲解,本小节将介绍如何在Eclipse中导入项目,并在手机上运行已经写好的Android程序.本节将以导入本书第9章百纳理财专家为例进行详细讲解,具体步骤如下. 1.在Eclipse中导入项目 (1)启动Eclipse,依次选择"File/Import"将弹出导入项目的窗口Import,选择Existing Projects

《Android 应用案例开发大全(第二版)》——2.6节绘制相关类

2.6 绘制相关类 Android 应用案例开发大全(第二版) 上一节完成了水族馆辅助绘制类开发过程的介绍,这一节将对本案例中的绘制相关类进行详细介绍.主要包括气泡绘制相关类.群鱼绘制相关类.鱼群绘制相关类和鱼食绘制相关类,从而使读者对本案例的开发有一个更加深刻的理解.下面就对这些绘制相关类进行详细介绍. 2.6.1 绘制气泡相关类 真实的水族馆中时常会冒出一些气泡,所以,在该壁纸中加入了透明气泡元素,从而达到仿真.酷炫的效果.最后本案例的运行效果是鱼在水族馆里面游,透明的气泡从屏幕下方不断冒出

《Android 应用案例开发大全(第二版)》——2.7节线程相关类

2.7 线程相关类 Android 应用案例开发大全(第二版) 上一节详细介绍了绘制相关类,使读者对本案例的开发有了进一步的理解,在这一节将对线程相关类的开发进行详细介绍.前面已经完成了对水族馆背景及水族馆中鱼.鱼群和气泡绘制的开发,但是只是将鱼.鱼群.气泡绘制出来是远远不够的,还要让它们动起来,从而产生更加真实的效果. 本案例中启动了多个线程来定时刷新它们的位置.线程相关类主要包括气泡移动线程类.群鱼游动线程类.鱼群游动线程类.鱼食游动线程类和吸引力线程类,下面就对线程相关类的开发进行详细介绍

《Android 应用案例开发大全(第二版)》——1.3节Android开发环境的搭建

1.3 Android开发环境的搭建 Android 应用案例开发大全(第二版) 本节主要讲解基于Eclipse的Android开发环境的搭建,模拟器的创建和运行,以及如何应用DDMS进行程序的调试. 1.3.1 Android SDK的安装及环境变量的配置 Android使用的编程语言是时下最流行的Java高级语言,Java的跨平台性和开源性,极大地促进了Android平台的发展. 首先要安装Java的JDK,并且正确地配置系统的环境变量(基于Windows操作系统).具体步骤如下. (1)

《Android 应用案例开发大全(第二版)》——2.1节案例背景及功能概述

2.1 案例背景及功能概述 Android 应用案例开发大全(第二版) 这一节将会对本案例背景及其基本功能进行简单介绍,通过本节学习,读者将会对本案例的具体功能及相应开发过程有一个整体了解,为读者进行以后的学习打下基础. 2.1.1 水族馆动态壁纸背景概述 壁纸是用户在手机屏幕上用来替代原先单一颜色背景的一张图片,有了这样一张图片可以使手机屏幕变得好看.漂亮.而随着移动手持设备功能的不断强大,静态壁纸已经不能再满足用户对酷炫壁纸的需求了,所以产生了动态壁纸. 动态壁纸是将手机屏幕所使用的壁纸以动

《Android 应用案例开发大全(第二版)》——2.9节壁纸的优化与改进

2.9 壁纸的优化与改进 Android 应用案例开发大全(第二版) 本章对3D水族馆动态壁纸的开发进行了详细介绍,在学习过程中,重点掌握鱼游动过程中鱼旋转角度的算法,并掌握鱼和鱼之间作用力变化规律,鱼受到的墙壁作用力变化规律等. 动态壁纸界面的优化 没有哪一个案例的运行界面是不可以更加完美和绚丽的,所以,对本案例的界面.风格,读者可以自行根据自己的想法进行改进,使其更加完美,如水族馆地面.背景壁纸.水草类等的纹理图都可以进一步完善,从而达到一个更加理想的效果. 动态壁纸物理碰撞的优化 本案例物

《Android 应用案例开发大全(第二版)》——2.2节壁纸策划及准备工作

2.2 壁纸策划及准备工作 Android 应用案例开发大全(第二版) 上一节介绍了本案例的背景及功能,本节将要介绍动态水族馆的策划以及开发前的准备工作.读者要认真阅读这一节,这对理解壁纸的开发有着很大的作用. 2.2.1 3D水族馆动态壁纸的策划 接下来将要对本案例的策划进行介绍,在以后的实际项目开发中,对项目的策划还需要更加地细致.具体.全面,该壁纸的策划如下所示. 动态水族馆. 本案例为3D水族馆动态壁纸,在该壁纸中有许多可以自由游动的鱼,点击该壁纸的地面可以给鱼喂食,壁纸前面还有透明的气

《Android 应用案例开发大全(第二版)》——2.4节壁纸的实现

2.4 壁纸的实现 Android 应用案例开发大全(第二版) 上一节介绍了壁纸的框架,让读者对壁纸的整体框架有了初步认识,本节将要对壁纸实现服务类GLWallpaperService.动态壁纸类LiveWallpaper.自定义渲染器类TDRender的开发进行详细介绍. 2.4.1 壁纸服务类--GLWallpaperService 该类是本项目中最基础的一个类,没有这个类就不可能使用壁纸这个功能.这个类为开发人员提供了壁纸服务,开发人员可以通过继承该类,重写此类中的方法来实现壁纸的后续开发

《Android 应用案例开发大全(第二版)》——1.4节 DDMS的灵活应用

1.4 DDMS的灵活应用 Android 应用案例开发大全(第二版) 作为一名合格的软件开发人员,必须要学会怎样去调试程序.因为调试是一个程序员最基本的技能,其重要性甚至超过学好一门语言.可以这样说,不会调试的程序员肯定不会有很好的发展. 那么什么是调试呢?所谓程序调试,是在软件投入实际使用前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程.这是保证软件系统正确性的必不可少的步骤. Android为开发人员提供了一个强大的调试工具--DDMS,通过DDMS可以调试并监控程序的运行

《Android 应用案例开发大全(第二版)》——1.7节Android应用程序的项目结构

1.7 Android应用程序的项目结构 Android 应用案例开发大全(第二版) 从上面的项目中读者已经知道了通过Android SDK可以自动生成一个项目包,但是没有对项目包里的内容进行介绍,本节对项目包中的内容进行一一介绍,项目包如图1-35所示. src源代码目录:该目录存放Android应用程序所有的源代码.该目录项有不同的包,包中对应开发的源程序,开发人员开发的主要精力都集中在开发src目录下内容. gen文件夹目录:该目录存放了Eclipse的ADT插件自动生成的R.java文件