安卓企业开发(三) activity的四种经典传值方法
2014-12-04 14:11
239 查看
开发中遇到多个activity的传值问题 相邻两个之间的传值 或者多个三个以上之间的传值问题
1 一般的注册或者登陆成功后 跳到某一新activity传值问题
2 注册界面需要选择性别 需要打开一个新的界面选择里面的信息回到当前activty的传值问题
3 设置界面需要某一界面选择的图片(但是还没上传服务),如果中间相隔几种activty时的传值。
目前有比较经典的四种比较经典的传值方法
一 如果是两个相邻activity之间的传值:
可以用Intent传值 对象和单个属性都可以
OneActivity 里设置
TwoActivity 里取值
当然你也可以用bundle进行封装,然后进行传值,
二:相邻两个以上的activty之间的传值
可以照搬方法一 如果从one 传到two,然后继续three,可以继续intent, 但是比较笨拙 界面一多就会晕了
首先可以自定义个全局类,用于储存临时数据。
OneActivity :
这样我们在其他activty里随时可以取值,不受activity的限制,
定义你需要传递的对象或者属性 在One中拿到user或者但多email和password, 去实例化赋值 然后再除了one的任何一个Activity中去取值使用 如果你的信息比较多 需要每个界面添加不同的属性给个这个对象USER 你可以拿到这个user不断去set属性值 到你最后一个界面使用的时候去取值使用就ok
,是不是挺方便的
但是以上方式建议不要过度使用比如包含大量图片的时候 容易出现内存溢出情况,因为一开始内存就会给我开辟内存空间,如果需要持久的话我们可以用做磁盘持久,
这种思维也可以拓展为 数据库 网络服务器(登录后,到首页再向服务器获取) 或者xml 进行中转。
三 如果是ONe 界面到two界面 拿到user的选择sex或者address 需要回到当前ONe 的情况下
1 在ONe 中使用
//此方法跳到B
2 two可以在finsh之前 将user或者某个属性扔给one界面
3 two使用 onActivityResult方法接受此intent
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
user.setName(data.getStringExtra("sex"))
Toast.makeText(this, data.getStringExtra("sex"), 1).show();//得到返回的user
取出用户选择的性别
super.onActivityResult(requestCode, resultCode, data);
}
四 使用回调
大致步骤
在two中的定义一个回调接口
one中去实现这个接口原型 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也会被放入到别的任务当中。
------------------------------------------------------------横线中数据来自网络 特此说明-------------------------------------------------------------------------
通过设置启动模式我们可以轻而易举的回去到保留的数据 可以通过
中的bundle数据用于获取任务中的此界面记录的数据,然后恢复到本身activty中。
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
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
user.setName(data.getStringExtra("sex"))
Toast.makeText(this, data.getStringExtra("sex"), 1).show();//得到返回的user
取出用户选择的性别
super.onActivityResult(requestCode, resultCode, data);
}
四 使用回调
大致步骤
在two中的定义一个回调接口
one中去实现这个接口原型 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数据用于获取任务中的此界面记录的数据,然后恢复到本身activty中。
相关文章推荐
- 安卓企业开发(三) activity的四种经典传值方法
- Android Activity的四种经典传值方法
- Android中Activity的四种经典传值方法
- Android中Activity的四种经典传值方法
- 【安卓开发-3】Activity的四种启动模式、Intent的显式和隐式使用方式
- 【Android】安卓开发之activity如何传值到fragment,activity与fragment传值
- 安卓开发:Activity之间的切换和传值
- 【安卓开发-2】第一次实现Activity的跳转、Activity生命周期、3种正向传值、反向传值
- [置顶] 【Android】安卓开发之activity如何传值到fragment,activity与fragment传值
- 3.安卓开发隐藏Activity中的标题栏的方法
- 安卓开发没有关闭界面就调用了onActivityResult方法?onActivityResult方法Intent-data总是null
- Activity与Service绑定(activity调用service方法)--安卓软件开发
- 安卓开发中遇到的Intent的startActivityForResult方法回调后不执行onActivityResult方法
- [Andriod开发] 启动程序时不显示主Activity的方法
- Android4开发入门经典 之 第三部分:Activity
- 企业实现服务器负载均衡常见的四种方法
- Android开发中保存数据的四种方法方法
- 求最大子序列和及其位置(四种经典方法)
- 安卓开发adb联机调试方法
- Android开发中保存数据的四种方法方法