在之前的學習中,我們一直都在MainActivity這樣的單個活動介面進行各種操作的,而在實際應用中需要多個頁面的跳轉來增加和使用者的互動性。那麼本篇將圍繞Activity展開,簡單瞭解Activity各個生命週期,討論如何建立Activity,其中涉及到AndroidManifest配置檔案,最後討論如何使用Activity實現有無結果的頁面跳轉的方法。本篇內容目錄如下:
- Manifest配置檔案
- Activity生命週期
- Activity的建立方法
- 頁面跳轉的實現
1.AndroidManifest配置檔案
AndroidManifest.xml是整個應用的主配置清單檔案,包括應用的包名、版本號、元件、許可權等資訊,它用來記錄應用的相關的配置資訊。它在main資料夾下,從圖中可看出在manifest大標籤下有各種各樣的標籤,接下來將從全域性、元件和許可權三個方面解讀AndroidManifest裡的常用標籤。
(1)全域性部分:manifest是AndroidManifest.xml配置檔案的根標籤, 必須指定xlmns:android和package屬性, 且只包含一個application節點。
xlmns:android指定了Android的名稱空間,預設情況下是http://schemas.android.com/apk/res/android。 package是標準的應用包名,也是一個應用程式的預設名稱,為避免名稱空間的衝突,一般會以應用的域名來作為包名。 一般情況這部分不需要做改動。
(2)元件部分:由一個application標籤包裹著安卓四大元件。
在application標籤下有幾個面向全域性的屬性:android:icon(圖示)、android:label(標題)、android:theme(主題樣式)。 而在application標籤裡面包裹著安卓四大元件:activity(活動)、service(服務)、content provider(內容提供者)以及broadcast receiver(廣播接收者)。其中activity就是本篇的重點,它是一個應用程式通過螢幕提供給使用者進行互動介面的Android元件,其他三個元件還沒用到,後續介紹。在這四個元件新增到application時,一定要宣告android:name屬性,值以包名.類名的形式,其中包名(package)可省寫成 .類名 即可。
下面主要看Activity標籤:
每在Android應用中新增一個Activity都必須在AndroidManifest.xml配置檔案中宣告, 否則系統將不識別也不執行該Activity。當application下有多個Activity,可用 intent-filter表示當前這個Activity是主頁面。
(3)許可權部分:許可權就是當使用者安裝應用程式的時候,提示使用者該程式為提供服務必須獲得的許可權。可用uses-permission標籤宣告一系列系統許可權,需要的時候新增就可以,如下圖就是一個申請訪問網路的許可權;當然也可以自定義許可權,用到permission標籤,並用name唯一標識自定義許可權的名稱,在其他應用程式中必須有這個name的permission才能訪問到該應用程式,故目的是保護該程式裡重要的元件。
2.Activity生命週期
下圖表示了Activity從建立到銷燬的一個完整的生命週期,包含七種方法和四種狀態,下面分別介紹一下。
(1)七種方法:
(2)四種狀態:(為方便起見用字母代表方法)
活動狀態:Activity處於頁面最頂端。當啟動應用時,將依次呼叫方法A->B->C,使應用獲得焦點處於活動狀態。
暫停狀態:Activity失去焦點,但此時對使用者可見。比如當另一個Activity在前一個Activity之上,而前一個Activity又是可見的並且部分透明或者沒有覆蓋整個螢幕時,該Activity會呼叫方法D失去焦點。返回到該Activity後又會呼叫C方法使它又處於活動狀態。
停止狀態:Activity完全被遮擋,但此時還保留所有狀態和成員資訊。比如當按下Home鍵使得應用處於後臺,這個過程呼叫方法D->E,應用處於暫停狀態;當重新回到應用,這個過程呼叫方法G->B->C,使應用再次獲得焦點。
非活動狀態:Activity被銷燬。當退出應用時,呼叫方法D->E->F最後整個應用被銷燬。
3.Activity的建立方法
在簡單瞭解配置檔案和生命週期之後,接下來就可以用activity生命週期裡一個重要方法—— onCreate() 實現如何建立一個Activity了。共四步:
step1:新建一個類,並繼承AppCompatActivity類或Activity類。與Activity類不同的是,AppCompatActivity預設帶標題欄,在v7包,且Android studio的工程也是預設繼承AppcompatActivity類。
step2:重寫方法onCreate()。
step3:用setContentView()方法設定在該Activity上顯示的佈局檔案。
step4:最後一定要在AndroidManifest配置檔案宣告該Activity, 如果是主活動需要加上 intent-filter標籤。
這樣應用中就有多個活動頁面,那如何實現頁面之間的跳轉呢?這裡需要引入一個重要的類:Intent類(意圖),它可以協助完成Android各個元件之間的通訊,充當信使的作用。接下來就用Intent意圖實現無結果和有結果的頁面跳轉功能,demo是通過點選按鈕實現兩個頁面之間的跳轉,如下圖展示的效果。
4.頁面跳轉的實現
(1)無結果的頁面跳轉
首先建立好兩個Activity,注意在AndroidManifest給FirstActivity新增標籤 intent-filter。
上述準備工作都完成後,Intent意圖就可以開始它的表演了!在button點選事件裡初始化一個Intent物件,並給予兩個引數告訴Intent從哪個頁面跳轉到那個頁面,需要注意的是如果用匿名內部類方式註冊點選事件,初始化Intent時直接用this是訪問不到當前activity的,兩種可行辦法:第一種辦法用activity類名.this引用,第二種辦法在方法外初始化一個全域性變數並給它賦值this,這時引用該成員變數即可。最後用startActivity方法執行意圖就完成了,具體程式碼和註解如下。
可以看到實現無結果的頁面跳轉很容易,只用意圖就可以做到,那如何讓第二個頁面返回結果給第一個介面呢,這個時候需要在兩個介面上多做些文章了。
(2)有結果的頁面跳轉
step1.首先在當前頁面onCreate方法裡換一種執行意圖的方法,具體步驟如下:
1)註冊點選事件
2)初始化一個Intent物件,參數列示(上下文物件,目標檔案),意圖從當前頁面跳轉到目標頁面
3)用方法startActivityForResult執行意圖,參數列示(Intent物件,請求訪問介面即主動方的int型標誌)
複製程式碼
這裡我用startActivityForResult(intent, 1)給第一個頁面標號為1,那麼給它一個獨有的標誌有什麼作用呢?且不要著急看到最後就會明白了。
step.2.然後在目標頁面onCreate方法裡準備回傳的資料:
1)註冊點選事件
2)初始化一個Intent物件,但不需要實現跳轉,而需要用它的方法putExtra儲存需要
回傳的資料
3)用方法setResult回傳資料,參數列示(被請求訪問介面即被動方的int型標誌,Intent物件)
4) 用finish()結束目標頁面的程式
複製程式碼
這時候又會發現我用setResult(2,data)給第二個頁面標號為2,並且還帶著intent物件data,冥冥之中這些標誌似乎要搞個大事情......
step.3 最後再回到當前頁面,用方法onActivityResult接收回傳資料,參數列示(請求訪問介面即主動方的int型標誌,被請求訪問介面即被動方的int型標誌,Intent物件)
看到這裡就驗證了之前的預感是對的,能看到前面的精心準備——標號1,標號2還有從第二個頁面傳回的Intent物件都在這個方法裡實現了自己的價值。其實也可以這樣理解,onActivityResult這個方法裡的引數resultcode,是方便當前FirstActivity活動判斷哪個頁面返回的訊息,在複雜情況下返回的頁面太多時,每個頁面的唯一標號能更好的幫助它們辨識彼此。現在再回頭看看那幾個關鍵方法裡的requestCode和resultCode是不是就理解了呢?
>關於Activity和Intent就學習到這裡,從下一篇開始,將用幾篇的篇幅介紹幾種高階控制元件,感謝觀看~