zoukankan      html  css  js  c++  java
  • Activity之间的相互调用与传递参数

    Activity之间是如何调用的
    在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的。
    所谓Intent,它是Android中非常重要的内置组件,他可以理解为“我要干一件什么事情”。在Android中有3大组件:Activity,Service、Broadcast,他们之间的通信都是通过Intent来完成的,所以Intent其实就是告诉他们之间的每一个人,要干什么事情。
    创建自己的Activity
    高焕堂先生的Android讲义中有如下一段内容:
    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);  
             }  
    }  
     
    参考程序
    ActivityTest
    补充:
    在Intent中,可以携带Object类型的信息,读者查阅API后,可能会放先,putExtra()方法中,并没有实现object的,但是重载了如下的方法:putExtra(String name, Serializable value),只要将对象实现了Serializable接口,就可以添加进Intent了。
    对象序列化及反序列化
    一个对象产生后,实际上是在内存中开辟了一个存储空间,方便存储信息。
    对象的序列化,就是一个对象变成二进制数据流的一种方法,通过对象的序列化可以方便的实现对象的传输与存储。
    如果一个类的对象想要被序列化,必须实现Serializable接口,但是该接口中无方法,它属于一个标示接口,表示具备了某种能力。
    序列化和反序列化,可以理解为:
    序列化:程序àObjectOutputStreamà序列化对象
    反序列化:序列化对象àObjectInputStreamà程序
    在序列化的时候,可以通过serialVersionUID来标识序列化版本。
    值得注意的是,序列化存储的只是对象的成员变量。
    ObjectInputStream中的readObject()方法可读取对象。
    ObjectOutputStream中的writeObject()方法可写入对象。
  • 相关阅读:
    拥抱函数式编程 I
    关于CMS的那点事 I
    常用正规表达式
    javascript source map 的使用
    架构师修炼 后记
    CSS 天坑 I
    架构师修炼 III
    架构师修炼 II
    win10,VM14 安装cnetos6.9 虚拟机黑屏和只有光标闪烁解决办法
    C/C++数组初始化
  • 原文地址:https://www.cnblogs.com/top5/p/2414286.html
Copyright © 2011-2022 走看看