文/ http://blog.csdn.net/sk719887916/article/details/41723613  skay

开发中遇到多个activity的传值问题 相邻两个之间的传值 或者多个三个以上之间的传值问题

1 一般的注册或者登陆成功后 跳到某一新activity传值问题

2  注册界面需要选择性别  需要打开一个新的界面选择里面的信息回到当前activty的传值问题

3  设置界面需要某一界面选择的图片(但是还没上传服务),如果中间相隔几种activty时的传值。

目前有比较经典的四种比较经典的传值方法

一 如果是两个相邻activity之间的传值:

可以用Intent传值 对象和单个属性都可以

OneActivity 里设置

Intent intent = new Intent(OneActivity.this,TwoActivity.class);
				intent.putExtra("mEmail", mEmail);
				intent.putExtra("mPassword", mPassword);
				startActivity(intent);

TwoActivity 里取值

// 方法一
		Intent getIntent = getIntent();
		String mEmail = getIntent.getStringExtra("mEmail");
		String mPassword = getIntent.getStringExtra("mPassword");

当然你也可以用bundle进行封装,然后进行传值,

Intent intent = new Intent(OneActivity.this,TwoActivity.class);
				Bundle bundle = new Bundle();
				bundle.putString("mEmail", mEmail);
				bundle.putString("mPassword", mPassword);
				startActivity(intent);
    
二:相邻两个以上的activty之间的传值

    可以照搬方法一 如果从one 传到two,然后继续three,可以继续intent, 但是比较笨拙 界面一多就会晕了
   首先可以自定义个全局类,用于储存临时数据。
public class Constant {

	public static String mEmail;
	public static  String mPassword;

}

OneActivity :

	Intent intent = new Intent(OneActivity.this,TwoActivity.class);
				/*intent.putExtra("mEmail", mEmail);
				intent.putExtra("mPassword", mPassword);*/
				Constant.mEmail = mEmail;
				Constant.mPassword =mPassword;
				startActivity(intent);
这样我们在其他activty里随时可以取值,不受activity的限制,

String mEmail = Constant.mEmail;
		String mPassword = Constant.mPassword;
		mEmailView.setText(mEmail);
		mPasswordView.setText(mPassword);

定义你需要传递的对象或者属性 在One中拿到user或者但多email和password, 去实例化赋值 然后再除了one的任何一个Activity中去取值使用 如果你的信息比较多 需要每个界面添加不同的属性给个这个对象USER 你可以拿到这个user不断去set属性值 到你最后一个界面使用的时候去取值使用就ok
,是不是挺方便的

 但是以上方式建议不要过度使用比如包含大量图片的时候 容易出现内存溢出情况,因为一开始内存就会给我开辟内存空间,如果需要持久的话我们可以用做磁盘持久,
  
  这种思维也可以拓展为 数据库 网络服务器(登录后,到首页再向服务器获取)  或者xml 进行中转。 

三 如果是One 界面到two界面 拿到user,选择sex或者address, 需要回到当前ONe 的情况下

  1 在one中使用 
  //此方法跳到B 
 startActivityForResult(intent,code); //code是请求码 int类型

 
2  two可以在finsh之前 将user或者某个属性扔给one界面 
Intent rIntent = new Intent();
		rIntent.putExtra("sex", mSex);
		rIntent.putExtra("address", mAddress);
	    setResult(resultCode, getIntent());
	    finish();
resultCode 为返回码 用于区分从哪里返回。

  3 two使用 onActivityResult方法接受此intent
  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. // TODO Auto-generated method stub
  4. user.setName(data.getStringExtra("sex"))
  5. Toast.makeText(this, data.getStringExtra("sex"), 1).show();//得到返回的user
    取出用户选择的性别
  6. super.onActivityResult(requestCode, resultCode, data);
  7. }

四 使用回调 


 
大致步骤

  1:在two中的定义一个回调接口:

  public interface
CallBack{

    String getEmall():

  }


 2 :one中去实现这个接口原型:
  
 3 two中将你需要传的值(例如email)放到接口中
two中执行此接口方法就OK 这样A 就拿到了email了 
回调的功能不值这一点哦啊  可以在任何类里使用回调,不止仅限于activtiy
方法二也适用任何类
回调具体请看 回调详解 一文 
 
   到此为止,还有一点需要说明的 ,虽然activty的启动模式并是非传值,但是当某个avtivt跳到其他界面,然后关闭在回到当前界面的时候,有的需求需要可以保留本界面的一些数据,比如用户输入还没提交过的一些数据,如editview,等待上传的照片等。我们可以作为一种传值的方式。

Activity大家知道有四种启动模式
---------------------------------------------------------------------------------------------------------------------------------------------

"standard"(默认)

standard是默认的启动模式,即如果说明aunchMode属性,则自动就会使用这种启动模式。每次打开需开启新的activity

"singleTop"

如果要启动的这个Activity在当前Task中已经存在,并且还处于栈顶的位置,那么系统就不会再去创建一个该Activity的实例,而是调用栈顶Activity的onNewIntent()方法。声明成这种启动模式的Activity也可以被实例化多次,一个任务当中也可以包含多个这种Activity的实例。

举个例子来讲,一个任务的返回栈中有A、B、C、D四个Activity,其中A在最底端,D在最顶端。这个时候如果我们要求再启动一次D,并且D的启动模式是"standard",那么系统就会再创建一个D的实例放入到返回栈中,此时栈内元素为:A-B-C-D-D。而如果D的启动模式是"singleTop"的话,由于D已经是在栈顶了,那么系统就不会再创建一个D的实例,而是直接调用D Activity的onNewIntent()方法,此时栈内元素仍然为:A-B-C-D。

"singleTask"

这种启动模式表示,系统会创建一个新的任务,并将启动的Activity放入这个新任务的栈底位置。但是,如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法。声明成这种启动模式的Activity,在同一个任务当中只会存在一个实例。注意这里我们所说的启动Activity,都指的是启动其它应用程序中的Activity,因为"singleTask"模式在默认情况下只有启动其它程序的Activity才会创建一个新的任务,启动自己程序中的Activity还是会使用相同的任务,

"singleInstance"

这种启动模式和"singleTask"有点相似,只不过系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。

------------------------------------------------------------横线中数据来自网络 特此说明-------------------------------------------------------------------------

通过设置启动模式我们可以轻而易举的回去到保留的数据 可以通过

onCreate(Bundle savedInstanceState) 

中的bundle数据用于获取任务中的此界面记录的数据,然后恢复到本身activity中。

  

Android Activity的四种经典传值方法的更多相关文章

  1. Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...

  2. Android Activity的四种LaunchMode!!!

    本文转自: http://marshal.easymorse.com/archives/2950. 写的非常好,分享给大家!!! 在多Activity开发中,有可能是自己应用之间的Activity跳转 ...

  3. Android学习记录(8)—Activity的四种加载模式及有关Activity横竖屏切换的问题

    Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity ...

  4. Android 关于Activity的四种启动模式的简单介绍

    Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standar ...

  5. Android学习笔记四:activity的四种启动模式

    Activity有四种启动模式:standard,singleTop,singleTask,singleInstance. 1.standard:标准启动模式 默认模式,这个模式下启动的Activit ...

  6. Android中Activity的四种开发模式

    Activity的四种启动模式:standard.singleTop.singleTask.singleInstance   清单文件中的Activity配置使用:android:launchMode ...

  7. 【Android进阶】Activity的四种加载模式

    Activity的四种加载模式: 1.standard :系统的默认模式,一次跳转即会生成一个新的实例.假设有一个activity命名为Act1, 执行语句:startActivity(new Int ...

  8. Activity的四种启动模式

    Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...

  9. Android按钮的四种点击事件

    本文记录一下按钮的四种点击事件 第一种 public class MainActivity extends Activity { @Override protected void onCreate(B ...

随机推荐

  1. SpringMVC源码分析--文件上传

    SpringMVC提供了文件上传的功能,接下来我们就简单了解一下SpringMVC文件上传的开发及大致过程. 首先需要在springMVC的配置文件中配置文件上传解析器 <bean id=&qu ...

  2. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  3. 等价于n*n的矩阵,填写0,1,要求每行每列的都有偶数个1 (没有1也是偶数个),问有多少种方法。

    #define N 4 /* * 公式: * f(n) = 2^((n - 1) ^2) */ int calWays(int n) { int mutiNum = (n - 1) * (n - 1) ...

  4. 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。

    比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0: 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1 ...

  5. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  6. 在自己笔记本电脑上如何访问虚拟机的内容、包括可以使用ssh、访问tomcat、访问nginx

    1.给自己的电脑设置一个回环网卡,关于如何配置回环网卡,可以百度搜索一下 设置好后的状态如下: 并把回环网卡的ipv4的值设置成192.168.1.1 配置如下: 2.将vmware中的"虚 ...

  7. ROS_Kinetic_26 使用rosserial_windows实现windows与ROS master发送与接收消息

    使用rosserial_windows实现windows与ROS master发送与接收消息(适用版本hydro,indigo,jade,kinetic) 官方wiki地址汇总请参考:http://b ...

  8. XML之DOM解析模型

    <?xml version= "1.0" encoding = "UTF-8"> <articles> <article cate ...

  9. Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、

    LineNumberReader 跟综行号的缓冲字符输入流,些类定义了setLineNumber(int)和getLineNumber(int),它们可分别用于设置和获取当前行号 import jav ...

  10. UNIX网络编程——客户/服务器程序设计示范(七)

        TCP预先创建线程服务器程序,每个线程各自accept 前面讨论过预先派生一个子进程池快于为每个客户线程派生一个子进程.在支持线程的系统上,我们有理由预期在服务器启动阶段预先创建一个线程池以取 ...