Android 数据传递(一) Activity之间的数据传递
bundle
Bundle类是一个key-value对。Activity之间的数据通信可以通过bundle类来实现数据的存储。即将数据放入bundle里面,将Bundle传递。他的用法如下:
//新建Bundle,将数据放入bundle类里面
Bundle mBundle = new Bundle();
mBundle.putString("flag" , "1");
//新建一个intent对象,并将该bundle加入这个intent对象。
Intent intent = new Intent(); intent.setClass(FirstActivity.this, SecondActivity.class);
intent.putExtras(mBundle);
startActivity(intent);
startActivityForResult
这里仅仅是将数据传到第二个Activity,不需要返回的结果。这个例子只是说明Bundle的应用。下面主要讲解两个Activity之间互相的数据传递,即用startActivityForResult (Intent intent, int requestCode)
这是requestCode是请求码,当我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:
@Override public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
}
});
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
}
});
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
//来自按钮1的请求,作相应业务处理
case 2:
//来自按钮2的请求,作相应业务处理
}
}
}
在跳入的新的Activity中,使用setResult(int resultCode , Intent data) 实现这个Activitie关闭时向之前的Activity返回数据。这里有一个参数是resultCode 结果码。
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
public class ResultActivity extends Activity {
.....
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
......
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
}
}
}
下面是个具体的例子。我们新建3个Activity然后从第一个Activity中分别有两个选项跳入不同的Activity,然后不同的Activity返回不同的结果显示在第一个Activity。
下面分别是三个activity的布局文件
#activity_first.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/first"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_above="@+id/second"
android:layout_marginBottom="20dp"
android:textColor="@android:color/holo_red_light"
android:text="传入到第二个activity"/>
<TextView
android:id="@+id/second"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginBottom="20dp"
android:textColor="@android:color/holo_red_light"
android:text="传入到第三个activity"/>
<TextView
android:id="@+id/secondresult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_blue_bright"
android:layout_below="@+id/second"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:textSize="25sp"
android:text="第二个Activity初始文本"/>
<TextView
android:id="@+id/thirdresult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_green_light"
android:layout_below="@+id/secondresult"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:textSize="25sp"
android:text="第三个Activity初始文本"/>
</RelativeLayout>
#activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<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">
<TextView
android:id="@+id/ok"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="@android:color/holo_red_light"/>
</RelativeLayout>
#activity_third.xml
<?xml version="1.0" encoding="utf-8"?>
<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">
<TextView
android:id="@+id/error"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_below="@+id/ok"
android:textColor="@android:color/holo_red_light"/>
</RelativeLayout>
下面分别是三个Activity
#FirstActivity
public class FirstActivity extends AppCompatActivity implements View.OnClickListener{
private TextView first;
private TextView second;
private TextView secondresult;
private TextView thirdresult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
first = (TextView)findViewById(R.id.first);
second = (TextView) findViewById(R.id.second);
first.setOnClickListener(this);
second.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.first:
Bundle fbundle = new Bundle();
fbundle.putString("Second" , "Ok");
Intent fintent = new Intent(FirstActivity.this, SecondActivity.class);
fintent.putExtras(fbundle);
startActivityForResult(fintent, 1);
break;
case R.id.second:
Bundle sbundle = new Bundle();
sbundle.putString("Third" , "Error");
Intent sintent = new Intent(FirstActivity.this, ThirdActivity.class);
sintent.putExtras(sbundle);
startActivityForResult(sintent, 2);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode){
case 2:
secondresult = (TextView) findViewById(R.id.secondresult);
secondresult.setText(data.getExtras().getString("second"));
break;
case 3:
thirdresult = (TextView) findViewById(R.id.thirdresult);
thirdresult.setText(data.getExtras().getString("third"));
break;
}
}
}
#SecondActivity
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
private TextView ok;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ok = (TextView) findViewById(R.id.ok);
ok.setText(getIntent().getExtras().getString("Second"));
ok.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ok :
Bundle bundle = new Bundle();
bundle.putString("second","我的第二个Activity的数据");
Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
intent.putExtras(bundle);
setResult(2, intent);
finish();
break;
}
}
}
#ThirdActivity
public class ThirdActivity extends AppCompatActivity implements View.OnClickListener{
private TextView error;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
error = (TextView)findViewById(R.id.error);
error.setText(getIntent().getExtras().getString("Third"));
error.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.error:
Bundle bundle = new Bundle();
bundle.putString("third", "我的第三个Activity的数据");
Intent intent = new Intent(ThirdActivity.this, FirstActivity.class);
intent.putExtras(bundle);
setResult(3, intent);
finish();
break;
}
}
}
效果图如下:


现在我们更改一下界面,改为在FirstActivity中有两个选项同时传入一个Activity中,对其进行不同的修改。
这里我们修改下第一个Activity的view
#firstView
<?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/first"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_above="@+id/second"
android:layout_marginBottom="20dp"
android:textColor="@android:color/holo_red_light"
android:text="传入OK"/>
<TextView
android:id="@+id/second"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginBottom="20dp"
android:textColor="@android:color/holo_red_light"
android:text="传入Error"/>
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_blue_bright"
android:layout_below="@+id/second"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:textSize="25sp"
android:text="显示"/>
<TextView
android:id="@+id/thirdresult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_green_light"
android:layout_below="@+id/secondresult"
android:layout_centerHorizontal="true"
android:layout_margin="10dp"
android:textSize="25sp"
android:text=""/>
</RelativeLayout>
以及第二个activity的view
#second
<?xml version="1.0" encoding="utf-8"?>
<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">
<TextView
android:id="@+id/show"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="@android:color/holo_red_light"/>
</RelativeLayout>
以及第一个Activity和第二个Activity 根据第一个Activity的选项,使第二个Activity显示不同的结果,当第二个Activity结束的时候,根据requestCode不同,在第一个Activity显示不同的结果
#firstActivty
public class FirstActivity extends AppCompatActivity implements View.OnClickListener{
private TextView first;
private TextView second;
private TextView result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
first = (TextView)findViewById(R.id.first);
second = (TextView) findViewById(R.id.second);
first.setOnClickListener(this);
second.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.first:
Bundle fbundle = new Bundle();
fbundle.putString("Second" , "Ok");
Intent fintent = new Intent(FirstActivity.this, SecondActivity.class);
fintent.putExtras(fbundle);
startActivityForResult(fintent, 1);
break;
case R.id.second:
Bundle sbundle = new Bundle();
sbundle.putString("Second" , "Error");
Intent sintent = new Intent(FirstActivity.this, SecondActivity.class);
sintent.putExtras(sbundle);
startActivityForResult(sintent, 2);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
result = (TextView) findViewById(R.id.result);
result.setText("OK");
break;
case 2:
result = (TextView) findViewById(R.id.result);
result.setText("Error");
break;
}
}
}
#SecondActivity
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
show = (TextView) findViewById(R.id.show);
show.setText(getIntent().getExtras().getString("Second"));
show.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.show :
finish();
break;
}
}
}
结果如下:



Android 数据传递(一) Activity之间的数据传递的更多相关文章
- Activity之间的数据传递-android学习之旅(四十七)
activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...
- Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...
- activity之间的数据传递方法
1 基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...
- activity之间通过全局变量传递数据
activity之间通过全局变量传递数据 一.简介 Application域中的onCreate方法是Android程序的入口,Android程序运行的时候就自动加载Application的对象,感觉 ...
- Activity之间的数据传递
最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...
- Activity之间使用intent传递大量数据带来问题总结
转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405 Activity之间使用Parcel传递大量数据产生的问题. Activity ...
- 安卓Fragment和Activity之间的数据通讯
Fragment是Android3.0之后才推出来的.可以用来做底部菜单,现在很多APP都有用到这个底部菜单.当然TabHost也可以用来做底部菜单,但是Fragment来做,动画效果这些可以做得更炫 ...
- 建立、配置和使用Activity——使用Bundle在Activity之间交换数据
当一个Activity启动另一个Activity时,常常会有一些数据需要传过去——这就像Web应用从一个Servlet跳到另一个Serlvet时,Web应用习惯把需要交换的数据放入requestSco ...
- 使用 Bundle 在 Activity 之间交换数据
[toc] 使用 Bundle 在 Activity 之间交换数据 场景 当一个 Activity 启动另一个 Activity 时,常常会有一些数据需要传过去.因为两个 Activity 之间本来就 ...
随机推荐
- MongoDB GridFS 对图片进行增删改
using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using MongoDB.Driver.GridFS ...
- Win7上的ASP.NET MVC3项目在Win10上运行的一个坑
先解释一下问题:我原来的电脑环境是Win7+VS2015,因为新换了个电脑环境变成Win10+VS2015了,所以就把原先的项目复制到新的机器上,那么问题来了,原先的一个项目在VS2015上打开竟然直 ...
- Some About Spring
什么是Spring:Spring是一个从实际开发中抽取出来的框架,它对代码中需要重复解决的步骤抽象成为了一个框架.留给开发者的仅仅是与特定应用相关的部分,大大提高了企业应用的开发效率.例外.Sprin ...
- 在线编辑器的使用-KindEditor
第一种:KindEditor编辑器 步骤一:加载相应的核心的文件 下载地址:http://kindeditor.net/demo.php <link rel="stylesheet&q ...
- 1293. 3n+1数链问题 2016 12 23
/* 1293. 3n+1数链问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 在计算机科学上,有很多类问题是无法解 ...
- eclipse快速移动项目到另一台机器_步骤
快速移动项目到另一台机器_步骤 1.设置好eclipse的编码,必须对应个人项目文件的编码{ window--preferences--general--workspace-text file en ...
- 【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建
虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半 ...
- js生成验证码并检验
<html> <head> <title>验证码</title> <style type="text/css"> #co ...
- UIViewController的生命周期(根视图view从无到有的过程)
UIViewController的生命周期实质上是指根视图view从无到有的过程 1.首先新建一个工程:不从mainstoryBoard加载 (删除入口) 在AppDelegate.m --> ...
- typeid详解(转)
(http://www.cppblog.com/smagle/archive/2010/05/14/115286.html) 在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time ...