bundle

Google 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关闭后,系统都会调用前面ActivityonActivityResult(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关闭后,系统都会调用前面ActivityonActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivityNewActivity为要打开的新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之间的数据传递的更多相关文章

  1. Activity之间的数据传递-android学习之旅(四十七)

    activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...

  2. Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)

    Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...

  3. activity之间的数据传递方法

    1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...

  4. activity之间通过全局变量传递数据

    activity之间通过全局变量传递数据 一.简介 Application域中的onCreate方法是Android程序的入口,Android程序运行的时候就自动加载Application的对象,感觉 ...

  5. Activity之间的数据传递

    最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...

  6. Activity之间使用intent传递大量数据带来问题总结

    转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405   Activity之间使用Parcel传递大量数据产生的问题. Activity ...

  7. 安卓Fragment和Activity之间的数据通讯

    Fragment是Android3.0之后才推出来的.可以用来做底部菜单,现在很多APP都有用到这个底部菜单.当然TabHost也可以用来做底部菜单,但是Fragment来做,动画效果这些可以做得更炫 ...

  8. 建立、配置和使用Activity——使用Bundle在Activity之间交换数据

    当一个Activity启动另一个Activity时,常常会有一些数据需要传过去——这就像Web应用从一个Servlet跳到另一个Serlvet时,Web应用习惯把需要交换的数据放入requestSco ...

  9. 使用 Bundle 在 Activity 之间交换数据

    [toc] 使用 Bundle 在 Activity 之间交换数据 场景 当一个 Activity 启动另一个 Activity 时,常常会有一些数据需要传过去.因为两个 Activity 之间本来就 ...

随机推荐

  1. 猜数字 事先给定一个数字,然后让用户猜3次,猜不中就输了,猜中就赢了。 每次猜错,给出提示,less or big

    c = 0a = 10while c <3:    b = int(raw_input("请输入数字"))    if b == a:        print " ...

  2. jQuery操作Dom、jQuery事件机制、jQuery补充部分

    jQuery操作Dom: 修改属性: //使用attr()方法 //attr(name, value) //name:要修改的属性的属性名 //value:对应的值 //attr方法,如果当前标签有要 ...

  3. 根据用户IP获得所在城市

    运行以下代码即可<html> <head> <meta http-equiv="Content-Type" content="text/ht ...

  4. 三道关于Taylor级数的题目,证明你爹是你爹

    =============幂级数的唯一性==================

  5. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...

  6. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  7. 阿里云安装Tomcat

    1.Apache官方网站下载Tomcat http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.0.35/bin/apache-tomcat-8.0 ...

  8. IE8控件安装方法

    打开上传页面,IE提示安装控件,点击安装     刷新网页,点击允许运行加载项,需要允许两次  

  9. 使用 xcode 8 构建版本 iTunes Connect 获取不到应用程序的状态的解决办法

              Archive生成Release版本的ipa并将其提交到iTunesConnect,上传成功后我打开iTunesConnect网站登录我的开发账号,准备提交版本更新,然而我却找不到 ...

  10. android 连接蓝牙扫码枪,程序崩溃之onConfigurationChanged

    当android手机通过蓝牙连接扫码枪时,程序崩溃的原因之一是:键盘弹出或隐藏,触发程序走了onDestory->onCreate的生命周期,从而可能使得页面的某些初始化数据被清除了. 解决方法 ...