在这篇随笔里将讲解Activity的传值和回传值。

一、通过startActivity来进行Activity的传值

在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象我们可以精确的指定我们需要跳转的Activity上,或者通过Intent对象来指定我们要完成的一个action操作。

①.通过setClass方法来指定我们要跳转的Activity

  1. Intent intent = new Intent();
  2. intent.setClass(MainActivity.this, SecondActivity.class);

②.通过setAction方法来我们要完成的一个action操作

  1. Intent intent = new Intent();
  2. intent.setAction("com.xiaoluo.android_intent.second");

通过这种方式可以来指定我们的Intent对象要完成某个操作,这个操作可以是启动一个Activity,我们可以在AndroidManifest.xml中在 <Activity> 元素下指定一个 <intent-filter> 对象,然后其子元素声明一个 <action> 元素,这样我们可以将这个action动作绑定到了这个Activity上,即Android操作系统会去找与intent对象中指定的action名字的 <intent-filter>对象,然后执行相应的动作,例如:

  1.      <activity
  2. android:name="com.xiaoluo.android_intent.SecondActivity"
  3. android:label="SecondActivity">
  4. <intent-filter>
  5. <action android:name="com.xiaoluo.android_intent.second"/>
  6. <category android:name="android.intent.category.DEFAULT"/>
  7. </intent-filter>
  8. </activity>

这样我们的Intent对象,在启动时,就会找到名字为 com.xiaoluo.android_intent.second 的<intent-filter>对象,来启动我们的SecondActivity。

我们来看看如何在Activity对象中进行值的传递,也是通过 Intent 对象的各种putExtra方法来进行传递:

MainActivity:

  1. public class MainActivity extends Activity
  2. {
  3. private Button button;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. button = (Button)findViewById(R.id.button);
  12. button.setOnClickListener(new ButtonListener());
  13. }
  14.  
  15. class ButtonListener implements OnClickListener
  16. {
  17. @Override
  18. public void onClick(View v)
  19. {
  20. // Intent intent = new Intent();
  21. // intent.setClass(MainActivity.this, SecondActivity.class);
  22. Intent intent = new Intent();
  23. intent.setAction("com.xiaoluo.android_intent.second");
  24.  
  25. intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一个参数指定name,android规范是以包名+变量名来命名,后面是各种类型的数据类型
  26. intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");
  27.  
  28. Bundle bundle = new Bundle();  //  Bundle的底层是一个HashMap<String, Object
  29. bundle.putString("hello", "world");
  30. intent.putExtra("bundle", bundle);
  31.  
  32. startActivity(intent);
  33. }
  34. }
  35.  
  36. @Override
  37. public boolean onCreateOptionsMenu(Menu menu)
  38. {
  39. // Inflate the menu; this adds items to the action bar if it is present.
  40. getMenuInflater().inflate(R.menu.main, menu);
  41. return true;
  42. }
  43.  
  44. }

SecondActivity:

  1. public class SecondActivity extends Activity
  2. {
  3. private TextView textView;
  4. private final String TAG = "SecondActivity";
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.second);
  10.  
  11. textView = (TextView)findViewById(R.id.textView);
  12.  
  13. // 得到跳转到该Activity的Intent对象
  14. Intent intent = getIntent();
  15.  
  16. int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);
  17. String name = intent.getStringExtra("com.xiaoluo.android_intent.name");
  18. Bundle bundle = intent.getBundleExtra("bundle");
  19. String world = bundle.getString("hello");
  20.  
  21. Log.i(TAG, age + ", " + name + ", " + world);
  22.  
  23. textView.setText(name + " : " + age + ", " + world);
  24.  
  25. System.out.println(intent);
  26. }
  27. }

在第二个Activity对象中,可以通过 getIntent() 方法来得到跳转到这个Activity的Intent对象,然后通过 Intent 对象的各种 getXXExtra 方法来得到我们的传过来的值。

AndroidManifest.xml文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.xiaoluo.android_intent"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="18" />
  10.  
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name="com.xiaoluo.android_intent.MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21.  
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25.  
  26. <activity
  27. android:name="com.xiaoluo.android_intent.SecondActivity"
  28. android:label="SecondActivity">
  29. <intent-filter>
  30. <action android:name="com.xiaoluo.android_intent.second"/>
  31. <category android:name="android.intent.category.DEFAULT"/>
  32. </intent-filter>
  33. </activity>
  34. </application>
  35.  
  36. </manifest>

这样我们就可以实现Activity直接的值的传递。

二、通过startActivityForResult方法来得到Activity的回传值

在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。

例如,我们希望完成下面一个功能,在MainActivity上,写上一个算术表达式,然后跳转到到第二个SecondActivity上,在这个Activity上将第一个Activity的表达式显示出来,然后我们可以输入我们的算术表达式结果,然后点击按钮,将这个结果值又返回给我们的MainActivity,并将结果填充到算术表达式中,具体看如下代码:

activity_main.xml:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10.  
  11. <EditText
  12. android:id="@+id/editText1"
  13. android:layout_width="70dp"
  14. android:layout_height="wrap_content" />
  15.  
  16. <TextView
  17. android:id="@+id/textView1"
  18. android:layout_width="60dp"
  19. android:layout_height="wrap_content"
  20. android:layout_toRightOf="@id/editText1"
  21. android:text=" + "
  22. android:textSize="30sp" />
  23.  
  24. <EditText
  25. android:id="@+id/editText2"
  26. android:layout_width="60dp"
  27. android:layout_height="wrap_content"
  28. android:layout_toRightOf="@id/textView1" />
  29.  
  30. <TextView
  31. android:id="@+id/textView2"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:layout_toRightOf="@id/editText2"
  35. android:text=" = "
  36. android:textSize="30sp" />
  37.  
  38. <EditText
  39. android:id="@+id/editText3"
  40. android:layout_width="70dp"
  41. android:layout_height="wrap_content"
  42. android:layout_toRightOf="@id/textView2" />
  43.  
  44. <Button
  45. android:id="@+id/button"
  46. android:layout_width="wrap_content"
  47. android:layout_height="wrap_content"
  48. android:layout_below="@id/editText3"
  49. android:layout_centerInParent="true"
  50. android:layout_marginTop="30dp"
  51. android:text="跳转到SecondActivity"/>
  52.  
  53. </RelativeLayout>

second.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <TextView
  7. android:id="@+id/textView1"
  8. android:layout_width="70dp"
  9. android:layout_height="wrap_content"
  10. android:textSize="20sp"/>
  11.  
  12. <EditText
  13. android:id="@+id/editText1"
  14. android:layout_width="60dp"
  15. android:layout_height="wrap_content"
  16. android:layout_toRightOf="@id/textView1"/>
  17.  
  18. <Button
  19. android:id="@+id/button1"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_toRightOf="@id/editText1"
  23. android:text="返回给MainActivity"/>
  24.  
  25. </RelativeLayout>

然后我们来看看两个Activity

MainActivity:

  1. public class MainActivity extends Activity
  2. {
  3. private Button button;
  4. private EditText editText1;
  5. private EditText editText2;
  6. private EditText editText3;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState)
  9. {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12.  
  13. button = (Button)findViewById(R.id.button);
  14. editText1 = (EditText)findViewById(R.id.editText1);
  15. editText2 = (EditText)findViewById(R.id.editText2);
  16. editText3 = (EditText)findViewById(R.id.editText3);
  17.  
  18. button.setOnClickListener(new OnClickListener()
  19. {
  20. @Override
  21. public void onClick(View v)
  22. {
  23. Intent intent = new Intent();
  24. intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");
  25. intent.setClass(MainActivity.this, SecondActivity.class);
  26. /*
  27. * 如果希望启动另一个Activity,并且希望有返回值,则需要使用startActivityForResult这个方法,
  28. * 第一个参数是Intent对象,第二个参数是一个requestCode值,如果有多个按钮都要启动Activity,则requestCode标志着每个按钮所启动的Activity
  29. */
  30. startActivityForResult(intent, 1000);
  31. }
  32. });
  33. }
  34.  
  35. /**
  36. * 所有的Activity对象的返回值都是由这个方法来接收
  37. * requestCode: 表示的是启动一个Activity时传过去的requestCode值
  38. * resultCode:表示的是启动后的Activity回传值时的resultCode值
  39. * data:表示的是启动后的Activity回传过来的Intent对象
  40. */
  41. @Override
  42. protected void onActivityResult(int requestCode, int resultCode, Intent data)
  43. {
  44. super.onActivityResult(requestCode, resultCode, data);
  45. if(requestCode == 1000 && resultCode == 1001)
  46. {
  47. String result_value = data.getStringExtra("result");
  48. editText3.setText(result_value);
  49. }
  50. }
  51.  
  52. @Override
  53. public boolean onCreateOptionsMenu(Menu menu)
  54. {
  55. getMenuInflater().inflate(R.menu.main, menu);
  56. return true;
  57. }
  58.  
  59. }

我们看到,这里我们使用的是 startActivityForResult 的这个方法,

  1. public void startActivityForResult (Intent intent, int requestCode)
  2.  
  3. Same as calling startActivityForResult(Intent, int, Bundle) with no options.
  4.  
  5. Parameters
  6. intent The intent to start.
  7. requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.
  8. Throws   android.content.ActivityNotFoundException

第一个指定我们的Intent对象,第二个requestCode指定我们的一个启动标志值,因为我们可能有多个按钮,如果都是跳转到同一个Activity对象上,我们需要对其进行标志,才知道是哪个Activity对象跳转过来的。

我们看到这里还有一个 onActivityResult 方法,这个方法就是用来处理我们Activity的回传值的方法,所有的Activity回传值的操作都是在这个方法中完成。

  1. protected void onActivityResult (int requestCode, int resultCode, Intent data)
  2.  
  3. Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.
  4.  
  5. You will receive this call immediately before onResume() when your activity is re-starting.
  6.  
  7. Parameters
  8. requestCode The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
  9. resultCode The integer result code returned by the child activity through its setResult().
  10. data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").

接下来,我们看看SecondActivity这个类:

  1. public class SecondActivity extends Activity
  2. {
  3. private Button button;
  4. private TextView textView;
  5. private EditText editText;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState)
  8. {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.second);
  11.  
  12. button = (Button)findViewById(R.id.button1);
  13. textView = (TextView)findViewById(R.id.textView1);
  14. editText = (EditText)findViewById(R.id.editText1);
  15.  
  16. Intent intent = getIntent();
  17. String message = intent.getStringExtra("message").toString().trim();
  18. textView.setText(message);
  19.  
  20. button.setOnClickListener(new OnClickListener()
  21. {
  22. @Override
  23. public void onClick(View v)
  24. {
  25. String result = editText.getText().toString().trim();
  26. Intent intent = new Intent();
  27. intent.putExtra("result", result);
  28. /*
  29. * 调用setResult方法表示我将Intent对象返回给之前的那个Activity,这样就可以在onActivityResult方法中得到Intent对象,
  30. */
  31. setResult(1001, intent);
  32. // 结束当前这个Activity对象的生命
  33. finish();
  34. }
  35. });
  36. }
  37. }

这个类里面我们将MainActivity传过来的值给TextView赋上,然后通过点击按钮将值回传给我们的 MainActivity,通过 setResult 方法可以将我们的值保存在Intent对象中,并返回给MainActivity对象,通过的 onActivityResult 方法来处理得到的回传Intent对象。finish()方法我们可以显示的结束这个Activity对象的生命。

最后我们来看一下AndroidManifest.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.xiaoluo.android_activity"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="18" />
  10.  
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name="com.xiaoluo.android_activity.MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21.  
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25. <activity
  26. android:name="com.xiaoluo.android_activity.SecondActivity"
  27. android:label="SecondActivity" >
  28. </activity></application>
  29.  
  30. </manifest>

我们来看看效果图:

Android 组件系列-----Activity的传值和回传值的更多相关文章

  1. Android组件系列----Activity组件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android 组件系列-----Activity生命周期

    本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity.如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周 ...

  3. Android 组件系列-----Activity初步

    在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...

  4. Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  5. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. 【转】Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  7. Android组件系列----当前Activity跳转到另一个Activity的详细过程

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  8. 第01讲 Android开发系列---Activity

    一.  Android系统版本及详细信息 最新数据  https://developer.android.com/about/dashboards/ 二.  Android项目初探 1.    使用a ...

  9. Android组件系列----BroadcastReceiver广播接收器

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

随机推荐

  1. Memcache学习php完整一例

    header("Content-Type:text/html;charset=utf-8"); /* PHP设置分布式memcache存取 */ //创建memcache对象 $m ...

  2. python基础语法(3)

    七.面向对象编程 python支持面向对象编程:类和对象是面向对象编程的两个主要方面,类创建一个新的类型,对象是这个类的实例. 对象可以使用普通的属于对象的变量存储数据,属于对象或类的变量被称为域:对 ...

  3. Linux查看当前目录下文件夹和文件的大小

    File参数实际上是一个目录,就要报告该目录内的所有文件.如果没有提供 File参数,du命令使用当前目录内的文件. 如果File参数是一个目录,那么报告的块的数量就是分配到目录中文件以及分配到目录自 ...

  4. Java将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    java.io 类 BufferedWriter java.lang.Object java.io.Writer java.io.BufferedWriter BufferedWriter publi ...

  5. java实验一 20135104刘帅

    实验报告 一.实验目的与要求: 实验目的: 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 实验要求: 1.没有Linux基础的同学建议先学习 ...

  6. [原] XAF 如何基于业务规则禁用属性

    How to: Disable Property Editors Based on a Business Rule // Developer Express Code Central Example: ...

  7. log4j使用方法

    项目在开发运行阶段,需要根据日志调试或者排错,这时候就需要有日志管理来帮助我们解决这些问题: 在java中我们可以使用System.out.println(),但是这种方式功能呢个太弱,而且不易控制, ...

  8. Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解

    CRM 2013 里流程有4个类别:操作(action).业务流程(business process flow).对话(dialog)和工作流(workflow).它们都是从 setting –> ...

  9. WPF快速入门系列(1)——WPF布局概览

    一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...

  10. 用 NuGet Package Explorer 管理你的攻城武器

    缘由:每次新建一个工程,总是要从自己的“弹药库”或者之前的工程里面手动引用一些类库和脚本插件,难免有些繁琐和遗漏.想起经常用到的NuGet,跑到NuGet主页一看,发现有 NuGet Package ...