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

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

阅读更多

 

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

作者:LEGEND

QQ158067568

Activity之间是如何调用的

javaWeb程序中,jspjsp之间的调用是通过重定向完成的,而在Android中,ActivityActivity之间的切换是通过Intent来完成的。

所谓Intent,它是Android中非常重要的内置组件,他可以理解为“我要干一件什么事情”。在Android中有3大组件:ActivityServiceBroadcast,他们之间的通信都是通过Intent来完成的,所以Intent其实就是告诉他们之间的每一个人,要干什么事情。

创建自己的Activity

高焕堂先生的Android讲义中有如下一段内容:

Android4种嫡系组件(ActivityServiceIntentReceiverContentProvider)之间如何互相沟通呢?这4种嫡系组件都是由Android启动的,并不是组件之间透过直接呼叫而启动的。

这段文字总结的十分精辟,它告诉了读者(以Activity为例)ActivityAndroid自启动的,这样的话,编程人员必须要明确告诉Android“我的应用程序里面有哪些是你要给我启动的”,而如何告诉Android这些信息呢,Android为我们提供了一个AndroidManifest.xml文件。在这个文件中,就可以告诉Android这些内容。这也是为什么我们在建立了自己的ActivityContentProvider等之后,必须要在配置文件中进行配置的原因。

以下代码是在自己定义的一个名为SecondActivityActivity,其配置代码如下:

<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添加参数,通过putExtrastringxxx)这组方法,就可实现。

putExtrastringxxx)方法类似于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处理完成后,需要同过setResultIntent i)方法来设置新的Activity结束后需要传递会旧的ActivityIntent。之后调用新的Activityfinish()方法,结束新的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);
                            }
                   }
 

参考程序

ActivityTest

补充:

Intent中,可以携带Object类型的信息,读者查阅API后,可能会放先,putExtra()方法中,并没有实现object的,但是重载了如下的方法:putExtra(String name, Serializable value),只要将对象实现了Serializable接口,就可以添加进Intent了。

对象序列化及反序列化

一个对象产生后,实际上是在内存中开辟了一个存储空间,方便存储信息。

对象的序列化,就是一个对象变成二进制数据流的一种方法,通过对象的序列化可以方便的实现对象的传输与存储。

如果一个类的对象想要被序列化,必须实现Serializable接口,但是该接口中无方法,它属于一个标示接口,表示具备了某种能力。

序列化和反序列化,可以理解为:

序列化:程序àObjectOutputStreamà序列化对象

反序列化:序列化对象àObjectInputStreamà程序

在序列化的时候,可以通过serialVersionUID来标识序列化版本。

值得注意的是,序列化存储的只是对象的成员变量

ObjectInputStream中的readObject()方法可读取对象。

ObjectOutputStream中的writeObject()方法可写入对象。

transient关键字

在序列化时,可以指定那个成员变量不被序列化,只要在成员变量之前添加transient关键字即可。

参考代码

这部分内容可参考代码DserPersonSerPersonPerson

Android中实现,可参考代码ActivityTest2

 

 

 

 

 

3
0
分享到:
评论
1 楼 xcs111 2012-05-19  
好贴顶!

相关推荐

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

    本文将深入解析Android Activity之间相互调用与传递参数的原理和实现方法。 首先,理解Activity的创建和调用。每个Activity在Android系统中都有自己的生命周期,它们并非直接通过函数调用来启动或关闭,而是通过...

    Android原生java语句 和html js互相调用 传递参数

    本教程将详细介绍如何在Android中通过Java语句与HTML中的JavaScript进行互调,并传递参数。 首先,我们需要在Android项目中引入`WebView`组件。在XML布局文件中添加一个`WebView`: ```xml android:id="@+id/...

    android两个APK相互调用并传参数

    在Android开发中,有时我们需要实现一个应用程序(APK)调用另一个应用程序并传递参数的功能。这通常是通过Intent机制来完成的,Intent是Android系统中用于启动活动(Activity)、服务(Service)或者其他组件的一种...

    Activity和Fragment之间相互传值和调用方法

    本篇文章将详细探讨如何在Activity与Fragment之间进行数据传递和方法调用,以提高应用的灵活性和可维护性。 首先,我们来看Activity向Fragment传递值的方法。这通常通过在创建Fragment时使用构造函数、setArguments...

    fragment activity与fragment相互传值 fragment与fragment跳转

    本示例主要关注两个核心知识点:Fragment与Activity之间的数据传递,以及Fragment之间的跳转。 首先,我们来探讨Fragment与Activity之间的数据传递。在Android中,有多种方式实现两者间的数据交换: 1. **通过...

    android与H5交互传参

    通过WebView组件,我们可以轻松地实现两者之间的通信,无论是H5调用Android的方法,还是Android调用H5的函数,都能有效地传递参数,实现功能的集成。AndroidWebViewDemo项目就是一个很好的学习资源,帮助开发者掌握...

    android两个activity相互传值

    在实际的开发过程中,常常需要在两个Activity之间传递数据,比如从一个Activity启动另一个Activity并传递一些参数,然后在新的Activity中处理这些参数,甚至在完成后将结果返回给原来的Activity。本文将详细讲解如何...

    Activity与远程Service通信,使用AIDL

    在Android开发中,Activity与Service之间的通信是应用中常见的需求,尤其当Service运行在远程进程中时,这种通信机制显得尤为重要。AIDL(Android Interface Definition Language)是Android提供的一种接口定义语言...

    unityAndriodStudio互相调用.zip

    下面我们将详细探讨如何实现Unity与Android Studio之间的互相调用。 首先,我们从Unity调用Android原生代码(Java或Kotlin)开始。Unity提供了一个名为UnityPlayer的类,它允许我们在C#脚本中调用Android的Java方法...

    Fragment和Activity通信以及Fragment之间通信的方式(1)

    1. **使用接口**:与Fragment和Activity通信类似,两个Fragment可以通过定义接口,互相调用对方的方法来通信。这种方法需要确保接口的生命周期管理正确,防止内存泄漏。 2. **通过Activity中转**:两个Fragment可以...

    ActivityForResult实现Activity回调

    在一个复杂的项目中,可能有多个`Activity`互相调用,所以需要合理管理请求码,避免冲突。可以定义常量来表示不同的请求码,例如: ```java public static final int LOGIN_REQUEST = 100; public static final int...

    fragment和activity间的互相通信

    本篇文章将深入探讨如何实现Activity与Fragment之间的三种主要通信方式:Activity向还未创建的Fragment传递数据、Fragment向Activity传递数据以及Activity向已存在的Fragment传递数据。 ### 一、Activity向还未创建...

    android使用html,实现android和JS之间的互相有参、无参调用

    5. 在Android中通过`loadUrl()`调用JavaScript函数,可以传递参数。 这种交互方式使得Android应用能够充分利用Web技术的灵活性,同时也能调用原生功能,实现更丰富的用户体验。在实际开发中,需要注意安全问题,...

    WebView实现Java与JS相互调用

    这样,我们可以调用网页中的函数,传递参数,并得到回调结果。 2. **JS调用Java**:为了安全起见,Android从API 17开始要求`@JavascriptInterface`注解,以防止恶意的跨域调用。JS可以通过`window.android.myMethod...

    Android学习笔记(七):多个Activity和Intent.doc

    多个Activity可以通过Intent相互调用并传递数据,使得应用能够实现更复杂的交互和功能。理解并熟练运用这些概念,对于构建动态、交互丰富的Android应用至关重要。同时,注意在`AndroidManifest.xml`中正确注册...

    Android_Activity的详细讲解

    这些数据将在Activity重新创建时通过onCreate(Bundle savedInstanceState)中的Bundle参数传递回来。 ```java @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState...

Global site tag (gtag.js) - Google Analytics