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

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

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

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

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

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

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

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

     <activity
android:name="com.xiaoluo.android_intent.SecondActivity"
android:label="SecondActivity">
<intent-filter>
<action android:name="com.xiaoluo.android_intent.second"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

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

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

MainActivity:

public class MainActivity extends Activity
{
private Button button; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
button.setOnClickListener(new ButtonListener());
} class ButtonListener implements OnClickListener
{
@Override
public void onClick(View v)
{
// Intent intent = new Intent();
// intent.setClass(MainActivity.this, SecondActivity.class);
Intent intent = new Intent();
intent.setAction("com.xiaoluo.android_intent.second"); intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一个参数指定name,android规范是以包名+变量名来命名,后面是各种类型的数据类型
intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo"); Bundle bundle = new Bundle();  //  Bundle的底层是一个HashMap<String, Object
bundle.putString("hello", "world");
intent.putExtra("bundle", bundle); startActivity(intent);
}
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

SecondActivity:

public class SecondActivity extends Activity
{
private TextView textView;
private final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second); textView = (TextView)findViewById(R.id.textView); // 得到跳转到该Activity的Intent对象
Intent intent = getIntent(); int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);
String name = intent.getStringExtra("com.xiaoluo.android_intent.name");
Bundle bundle = intent.getBundleExtra("bundle");
String world = bundle.getString("hello"); Log.i(TAG, age + ", " + name + ", " + world); textView.setText(name + " : " + age + ", " + world); System.out.println(intent);
}
}

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

AndroidManifest.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaoluo.android_intent"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.xiaoluo.android_intent.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <activity
android:name="com.xiaoluo.android_intent.SecondActivity"
android:label="SecondActivity">
<intent-filter>
<action android:name="com.xiaoluo.android_intent.second"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application> </manifest>

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

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

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

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

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <EditText
android:id="@+id/editText1"
android:layout_width="70dp"
android:layout_height="wrap_content" /> <TextView
android:id="@+id/textView1"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/editText1"
android:text=" + "
android:textSize="30sp" /> <EditText
android:id="@+id/editText2"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/textView1" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/editText2"
android:text=" = "
android:textSize="30sp" /> <EditText
android:id="@+id/editText3"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/textView2" /> <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/editText3"
android:layout_centerInParent="true"
android:layout_marginTop="30dp"
android:text="跳转到SecondActivity"/> </RelativeLayout>

second.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <TextView
android:id="@+id/textView1"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:textSize="20sp"/> <EditText
android:id="@+id/editText1"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/textView1"/> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/editText1"
android:text="返回给MainActivity"/> </RelativeLayout>

然后我们来看看两个Activity

MainActivity:

public class MainActivity extends Activity
{
private Button button;
private EditText editText1;
private EditText editText2;
private EditText editText3;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
editText1 = (EditText)findViewById(R.id.editText1);
editText2 = (EditText)findViewById(R.id.editText2);
editText3 = (EditText)findViewById(R.id.editText3); button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent();
intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");
intent.setClass(MainActivity.this, SecondActivity.class);
/*
* 如果希望启动另一个Activity,并且希望有返回值,则需要使用startActivityForResult这个方法,
* 第一个参数是Intent对象,第二个参数是一个requestCode值,如果有多个按钮都要启动Activity,则requestCode标志着每个按钮所启动的Activity
*/
startActivityForResult(intent, 1000);
}
});
} /**
* 所有的Activity对象的返回值都是由这个方法来接收
* requestCode: 表示的是启动一个Activity时传过去的requestCode值
* resultCode:表示的是启动后的Activity回传值时的resultCode值
* data:表示的是启动后的Activity回传过来的Intent对象
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1000 && resultCode == 1001)
{
String result_value = data.getStringExtra("result");
editText3.setText(result_value);
}
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

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

public void startActivityForResult (Intent intent, int requestCode)

Same as calling startActivityForResult(Intent, int, Bundle) with no options.

Parameters
intent The intent to start.
requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.
Throws   android.content.ActivityNotFoundException

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

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

protected void onActivityResult (int requestCode, int resultCode, Intent data)

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.

You will receive this call immediately before onResume() when your activity is re-starting.

Parameters
requestCode The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
resultCode The integer result code returned by the child activity through its setResult().
data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").

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

public class SecondActivity extends Activity
{
private Button button;
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second); button = (Button)findViewById(R.id.button1);
textView = (TextView)findViewById(R.id.textView1);
editText = (EditText)findViewById(R.id.editText1); Intent intent = getIntent();
String message = intent.getStringExtra("message").toString().trim();
textView.setText(message); button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
String result = editText.getText().toString().trim();
Intent intent = new Intent();
intent.putExtra("result", result);
/*
* 调用setResult方法表示我将Intent对象返回给之前的那个Activity,这样就可以在onActivityResult方法中得到Intent对象,
*/
setResult(1001, intent);
// 结束当前这个Activity对象的生命
finish();
}
});
}
}

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

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaoluo.android_activity"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.xiaoluo.android_activity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.xiaoluo.android_activity.SecondActivity"
android:label="SecondActivity" >
</activity></application> </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. VB6.0 读取CSV文件

    最近做了一个Upload文件的需求,文件的格式为CSV,读取文件的方法整理了一下,如下: 1.先写了一个读取CSV文件的Function: '读取CSV文件 '假设传入的参数strFile=C:\Do ...

  2. 6本Android开发必备图书

    学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好书往往可以让你少走很多弯路,事半功倍.今天与大家分享一些Android开发值得一读的书籍,希望对新手安卓开发者们有所帮助. 1. ...

  3. LeetCode(68) Text Justification

    题目 Given an array of words and a length L, format the text such that each line has exactly L charact ...

  4. stringgrid事件大全

    3.StringGrid之Event事件 property LiveBinding   //把对象之间的属性绑定起来(XE2新增功能) property OnApplyStyleLookup: TNo ...

  5. TCP/UDP socket

    TCP socket:有链接,绑定端口,接着去侦听,若有请求,那么accept(),获得新的socket,并且去接收/发送数据报. UDP socket:无连接,不需要侦听,也不用一个新的socket ...

  6. 【半平面交】bzoj2618 [Cqoi2006]凸多边形

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  7. 业务代码中(java class)中如何实现多线程,并且将子线程中的值随方法返回返回值

    转载自http://bbs.csdn.net/topics/390731832 问题: public static String getAddress(final InputStream inputS ...

  8. NOIP 2015 信息传递

    kawayi 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的 ...

  9. 使用页面Tag判断某个值为空值时,不能使用logic:equal(无效),可以使用logic:notPresent

    使用页面Tag判断某个值为空值时,不能使用logic:equal(无效),可以使用logic:notPresent

  10. Javac不是内部或外部指令

    JDK安装完,命令行窗口中运行Java正常,运行Javac显示不是内部或外部指令 不存在百度上说的没有安装JDK,只安装了JRE 我的电脑是64位Win7操作系统 第一次安装的JDK不是从官网下载的, ...