傳送門
Activity生命周期
Activity最全面詳解
1.本節前言
前面講了Activity的生命周期,本節給大家帶來的是關于Activity的介紹
2.什么是Activity
- Activity用于顯示用戶界面,用戶通過Activity交互完成相關操作
- 一個App允許有多個Activity
3.Activity/ActionBarActivity/AppCompatActivity的區別:
在開始講解創建Activity之前要說下這三個的一個區別: Activity就不用說啦,后面這兩個都是為了低版本兼容而提出的提出來的,他們都在v7包下, ActionBarActivity已被廢棄,從名字就知道,ActionBar~,而在5.0后,被Google棄用了,現在用 ToolBar...而我們現在在Android Studio創建一個Activity默認繼承的會是:AppCompatActivity! 當然你也可以只寫Activity,不過AppCompatActivity給我們提供了一些新的東西而已! 兩個選一個,Just you like~
4.Activity的創建流程
PS:
好了,上面也說過,可以繼承Activity和AppCompatActivity,只不過后者提供了一些新的東西而已! 另外,切記,Android中的四大組件,只要你定義了,無論你用沒用,都要在AndroidManifest.xml對 這個組件進行聲明,不然運行時程序會直接退出,報ClassNotFindException...
4.onCreate()一個參數和兩個參數的區別:
相信用as的朋友在重寫Act的onCreate()方法時會發現,這玩意有兩個參數:
可是正常的才只有一個參數啊:
恩呢,這就是5.0給我們提供的新的方法,要用它,先要在配置文件中為我們的Activity設置一個屬性:
android:persistableMode="persistAcrossReboots"
然后我們的Activity就擁有了持久化的能力了,一般我們會搭配另外兩個方法來使用:
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
相信有些朋友對這兩個方法名不陌生吧,前一個方法會在下述情形中被調用:
- 點擊home鍵回到主頁或長按后選擇運行其他程序
- 按下電源鍵關閉屏幕
- 啟動新的Activity
- 橫豎屏切換時,肯定會執行,因為橫豎屏切換的時候會先銷毀Act,然后再重新創建 重要原則:當系統"未經你許可"時銷毀了你的activity,則onSaveInstanceState會被系統調用, 這是系統的責任,因為它必須要提供一個機會讓你保存你的數據(你可以保存也可以不保存)。
而后一個方法,和onCreate同樣可以從取出前者保存的數據: 一般是在onStart()和onResume()之間執行! 之所以有兩個可以獲取到保存數據的方法,是為了避免Act跳轉而沒有關閉, 然后不走onCreate()方法,而你又想取出保存數據~
4.啟動一個Activity的幾種方式
在Android中我們可以通過下面兩種方式來啟動一個新的Activity,注意這里是怎么啟動,而非 啟動模式!!分為顯示啟動和隱式啟動!
1. 顯式啟動:通過包名來啟動,寫法如下:
①最常見的:
startActivity(new Intent(當前Act.this,要啟動的Act.class));
②通過Intent的ComponentName:
ComponentName cn = new ComponentName("當前Act的全限定類名","啟動Act的全限定類名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
③初始化Intent時指定包名:
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("當前Act的全限定類名","啟動Act的全限定類名");
startActivity(intent);
2.隱式啟動:
通過Intent-filter的Action,Category或data來實現 這個是通過Intent的 intent-filter來實現的,這個Intent那章會詳細講解! 這里知道個大概就可以了!
3. 另外還有一個直接通過包名啟動apk的:
Intent intent = getPackageManager().getLaunchIntentForPackage
("apk第一個啟動的Activity的全限定類名") ;
if(intent != null) startActivity(intent) ;
5.橫豎屏切換與狀態保存的問題
前面也也說到了App橫豎屏切換的時候會銷毀當前的Activity然后重新創建一個,你可以自行在生命周期 的每個方法里都添加打印Log的語句,來進行判斷,又或者設一個按鈕一個TextView點擊按鈕后,修改TextView 文本,然后橫豎屏切換,會神奇的發現TextView文本變回之前的內容了! 橫豎屏切換時Act走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume
關于橫豎屏切換可能遇到下述問題:
1.先說下如何禁止屏幕橫豎屏自動切換吧,很簡單,在AndroidManifest.xml中為Act添加一個屬性: android:screenOrientation
, 有下述可選值:
- unspecified:默認值 由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向。
- landscape:橫屏顯示(寬比高要長)
- portrait:豎屏顯示(高比寬要長)
- user:用戶當前首選的方向
- behind:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
- sensor:有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
- nosensor:忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了("unspecified"設置除外)。
2.橫豎屏時想加載不同的布局:
1)準備兩套不同的布局,Android會自己根據橫豎屏加載不同布局: 創建兩個布局文件夾:layout-land橫屏,layout-port豎屏 然后把這兩套布局文件丟這兩文件夾里,文件名一樣,Android就會自行判斷,然后加載相應布局了!
2 )自己在代碼中進行判斷,自己想加載什么就加載什么:
我們一般是在onCreate()方法中加載布局文件的,我們可以在這里對橫豎屏的狀態做下判斷,關鍵代碼如下:
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.橫屏);
}
else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.豎屏);
}
3. 如何讓模擬器橫豎屏切換
如果你的模擬器是GM的話。直接按模擬器上的切換按鈕即可,原生模擬器可按ctrl + f11/f12切換!
4. 狀態保存問題:
這個上面也說過了,通過一個Bundle savedInstanceState參數即可完成! 三個核心方法:
onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);
你只重寫onSaveInstanceState()方法,往這個bundle中寫入數據,比如:
outState.putInt("num",1);
這樣,然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存儲的數據,不過拿之前要判斷下是否為null哦!
savedInstanceState.getInt("num");
然后想干嘛就干嘛~