在之前的學習中,我們一直都在MainActivity這樣的單個活動界面進行各種操作的,而在實際應用中需要多個頁面的跳轉來增加和用戶的交互性。那么本篇將圍繞Activity展開,簡單了解Activity各個生命周期,討論如何創建Activity,其中涉及到AndroidManifest配置文件,最后討論如何使用Activity實現有無結果的頁面跳轉的方法。本篇內容目錄如下:
- Manifest配置文件
- Activity生命周期
- Activity的創建方法
- 頁面跳轉的實現
1.AndroidManifest配置文件
AndroidManifest.xml是整個應用的主配置清單文件,包括應用的包名、版本號、組件、權限等信息,它用來記錄應用的相關的配置信息。它在main文件夾下,從圖中可看出在manifest大標簽下有各種各樣的標簽,接下來將從全局、組件和權限三個方面解讀AndroidManifest里的常用標簽。
(1)全局部分:manifest是AndroidManifest.xml配置文件的根標簽, 必須指定xmlns: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活動判斷哪個頁面返回的消息,在復雜情況下返回的頁面太多時,每個頁面的唯一標號能更好的幫助它們辨識彼此?,F在再回頭看看那幾個關鍵方法里的requestCode和resultCode是不是就理解了呢?
>關于Activity和Intent就學習到這里,從下一篇開始,將用幾篇的篇幅介紹幾種高級控件,感謝觀看~