`
Virgo_S
  • 浏览: 1135931 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity之间的相互调用与传递参数

阅读更多
Activity之间是如何调用的
Activity与Activity之间的切换是通过Intent来完成的。
所谓Intent,它是Android中非常重要的内置组件,他可以理解为“我要干一件什么事情”。他们之间的通信都是通过Intent来完成的,所以Intent其实就是告诉他们之间的每一个人,要干什么事情。
Android的4种嫡系组件(即Activity、Service、IntentReceiver和ContentProvider)之间如何互相沟通呢?这4种嫡系组件都是由Android启动的,并不是组件之间透过直接呼叫而启动的。
这段文字总结的十分精辟,它告诉了读者(以Activity为例)Activity是Android自启动的,这样的话,编程人员必须要明确告诉Android“我的应用程序里面有哪些是你要给我启动的”,而如何告诉Android这些信息呢,Android为我们提供了一个AndroidManifest.xml文件。在这个文件中,就可以告诉Android这些内容。这也是为什么我们在建立了自己的Activity、ContentProvider等之后,必须要在配置文件中进行配置的原因。
以下代码是在自己定义的一个名为SecondActivity的Activity,其配置代码如下:
<activity android:name=".SecondActivity"
         android:label="secondActivity">
</activity>

在android:name一项中中的“.”代表在当前配置文件的默认包名之下。
Activity之间的切换
从一个Activity调用另一个Activity,十分简单,只需要创建一个Intent,并且告诉Intent我从哪来,要到哪去,然后执行这个Intent,就可以了。示例代码如下:
Intent i = new Intent(TestActivity.this,SecondActivity.class);
startActivity(i);
当然,这样只能够做到Activity之间的切换,如果想在切换的同时,由旧的Activity向新的Activity传递一些参数,那么就要在startActivity()方法之前,为Intent添加参数,通过putExtra(string,xxx)这组方法,就可实现。
putExtra(string,xxx)方法类似于map,键都是String型,值有不公类型,该方法被重载,具体可参考API,示例代码如下:
Intent i = new Intent(TestActivity.this,SecondActivity.class);
i.putExtra("uName", "legend");
i.putExtra("uAge", (short)18);
startActivity (i);

获取Intent传递的值
旧的Activity将值传递给了新的Activity,那么在新的Activity中,要通过getIntent()方法,方可接收传递过来的Intent。得到Intent后通过getxxxExtra()方法,可以取得不同类型的值。如下所示:
Intent i = getIntent();
String uName = i.getStringExtra("uName");
short uAge = i.getShortExtra("uAge", (short) 0);

旧Activity得到新Activity结束后传递的Intent
在开发中,有这种情况,比如说我们的一个Activity要调用一个新的Activity,让后用户对新的Activity操作完成后,关闭新的Activity,这时需要将新的Activity中的一些值传递给旧的Activity。这就中情况不用自己处理,Android已经为我们编写了一个onActivityResult(int requestCode, int resultCode, Intent data)方法,专门处理这种情况。

首先,在旧的Acitvity中的启动Intent方法不能再使用之前的startActivity,而要给用startActivityForResult(i, REQUESTCODE1 );方法,该方法第一个参数为要传递的intent,第二个参数为请求码,该请求码其实就是一个整型变量,用于指明是那个方法、或者说是那个控件启动了该intent,其最主要的目的是在onActivityResult(int requestCode, int resultCode, Intent data)方法中,编程使用。读者这里可以不用深究,看到例子后,便会明白。该处代码如下:
Intent i = new Intent(TestActivity.this,SecondActivity.class);
i.putExtra("uName", "legend");
i.putExtra("uAge", (short)18);
startActivityForResult(i, REQUESTCODE1 );

其次,在新的Activity中要接受刚刚传递的Intent,接受方法如上所述,这里不再赘述。在新的Acitvity处理完成后,需要同过setResult(Intent i)方法来设置新的Activity结束后需要传递会旧的Activity的Intent。之后调用新的Activity的finish()方法,结束新的Acitvity就可以了。代码如下:
Intent resultIntent = new Intent();
resultIntent.putExtra("uName", "legend2");
resultIntent.putExtra("uAge", (short)22);
setResult(RESULTCODE1, resultIntent);
SecondActivity.this.finish();

最后,在旧的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法,该方法的三个参数,这里就不在赘述了,相信读者一看即明白,这里给出代码如下:
if(requestCode == REQUESTCODE1){
    System.out.println("REQUESTCODE equal");
    if(resultCode == SecondActivity.RESULTCODE1){
        System.out.println("RESULTCODE equal");
        String uName = data.getStringExtra("uName");
        short uAge = data.getShortExtra("uAge", (short)0);
        tv.setText("uName:"+uName+" uAge:"+uAge);
    }
}

补充:
在Intent中,可以携带Object类型的信息,读者查阅API后,可能会放先,putExtra()方法中,并没有实现object的,但是重载了如下的方法:putExtra(String name, Serializable value),只要将对象实现了Serializable接口,就可以添加进Intent了。
对象序列化及反序列化
一个对象产生后,实际上是在内存中开辟了一个存储空间,方便存储信息。
对象的序列化,就是一个对象变成二进制数据流的一种方法,通过对象的序列化可以方便的实现对象的传输与存储。
如果一个类的对象想要被序列化,必须实现Serializable接口,但是该接口中无方法,它属于一个标示接口,表示具备了某种能力。
序列化和反序列化,可以理解为:
序列化:程序àObjectOutputStreamà序列化对象
反序列化:序列化对象àObjectInputStreamà程序
在序列化的时候,可以通过serialVersionUID来标识序列化版本。
值得注意的是,序列化存储的只是对象的成员变量。
ObjectInputStream中的readObject()方法可读取对象。
ObjectOutputStream中的writeObject()方法可写入对象。
transient关键字
在序列化时,可以指定那个成员变量不被序列化,只要在成员变量之前添加transient关键字即可。
分享到:
评论
1 楼 1035584493 2012-05-25  
还可以吧,就是不知道楼主有没有类包含类的传递数据,就是在最里面的类中得到这个字段的数据,在外面的类中操作这个字段,比如对这个字段进行删除,修改

相关推荐

    Android Activity之间相互调用与传递参数的原理与用法分析

    本文实例讲述了Android Activity之间的相互调用与传递参数。分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与...

    Android开发案例驱动教程 配套代码

    9.3.1 多个Activity之间数据传递 189 9.3.2 跳转与返回 192 9.3.3 任务与标志 196 9.4 Android系统内置Intent 199 本章小结 201 第10章 数据存储 203 10.1 健康助手案例 203 10.2 Android数据存储概述 205 ...

    新版Android开发教程.rar

    开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 11 月 5 日宣布组建的一个全球性的联 盟组织。这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 ...

    source.zip

    33_为应用添加多个Activity与参数传递.avi 所在项目:MulActivity 34_Activity的启动模式.avi 所在项目:LaunchMode & openSingleInstance & singleInstance 35_Intent深入解剖.avi 所在项目:Intent 36_Activity...

    8天快速掌握Android教程源码

    33_为应用添加多个Activity与参数传递.avi 所在项目:MulActivity 34_Activity的启动模式.avi 所在项目:LaunchMode & openSingleInstance & singleInstance 35_Intent深入解剖.avi 所在项目:Intent 36_Activity...

    传智播客的android开发源代码

    33_为应用添加多个Activity与参数传递.avi 所在项目:MulActivity 34_Activity的启动模式.avi 所在项目:LaunchMode & openSingleInstance & singleInstance 35_Intent深入解剖.avi 所在项目:Intent 36_Activity...

    ios开发记录

    //此方法可以有参数,也可以没有参数,如果没有参数系统不会给你穿参数,如果有参数,只能有一个参数,无论你所指定的参数类型是什么,系统只会把tf本身给传过去 [tf addTarget:self action:@selector(down:) ...

Global site tag (gtag.js) - Google Analytics