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()方法可寫入對象。
發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章