Android Activity之間相互調用與傳遞參數的原理與用法分析_Android

來源:互聯網
上載者:User

本文執行個體講述了Android 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()方法可寫入對象。

更多關於Android相關內容感興趣的讀者可查看本站專題:《Android編程之activity操作技巧總結》、《Android視圖View技巧總結》、《Android操作SQLite資料庫技巧總結》、《Android操作json格式資料技巧總結》、《Android資料庫操作技巧總結》、《Android檔案操作技巧匯總》、《Android編程開發之SD卡操作方法匯總》、《Android開發入門與進階教程》、《Android資源操作技巧匯總》及《Android控制項用法總結》

希望本文所述對大家Android程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.