Android之Activity 最全面的詳解

傳送門

Activity生命周期

Activity最全面詳解

1.本節(jié)前言

前面講了Activity的生命周期搓幌,本節(jié)給大家?guī)淼氖顷P于Activity的介紹

2.什么是Activity

    1. Activity用于顯示用戶界面嘶炭,用戶通過Activity交互完成相關操作
    1. 一個App允許有多個Activity

3.Activity/ActionBarActivity/AppCompatActivity的區(qū)別:

在開始講解創(chuàng)建Activity之前要說下這三個的一個區(qū)別: Activity就不用說啦,后面這兩個都是為了低版本兼容而提出的提出來的账胧,他們都在v7包下悄但, ActionBarActivity已被廢棄麻掸,從名字就知道梭域,ActionBar~斑举,而在5.0后,被Google棄用了病涨,現(xiàn)在用 ToolBar...而我們現(xiàn)在在Android Studio創(chuàng)建一個Activity默認繼承的會是:AppCompatActivity! 當然你也可以只寫Activity富玷,不過AppCompatActivity給我們提供了一些新的東西而已! 兩個選一個既穆,Just you like~

4.Activity的創(chuàng)建流程

PS:
好了赎懦,上面也說過,可以繼承Activity和AppCompatActivity幻工,只不過后者提供了一些新的東西而已铲敛! 另外,切記会钝,Android中的四大組件,只要你定義了工三,無論你用沒用迁酸,都要在AndroidManifest.xml對 這個組件進行聲明,不然運行時程序會直接退出俭正,報ClassNotFindException...

4.onCreate()一個參數(shù)和兩個參數(shù)的區(qū)別:

相信用as的朋友在重寫Act的onCreate()方法時會發(fā)現(xiàn)奸鬓,這玩意有兩個參數(shù):

可是正常的才只有一個參數(shù)啊:

恩呢掸读,這就是5.0給我們提供的新的方法串远,要用它,先要在配置文件中為我們的Activity設置一個屬性:

android:persistableMode="persistAcrossReboots"

然后我們的Activity就擁有了持久化的能力了儿惫,一般我們會搭配另外兩個方法來使用:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)

相信有些朋友對這兩個方法名不陌生吧澡罚,前一個方法會在下述情形中被調用:

  • 點擊home鍵回到主頁或長按后選擇運行其他程序
  • 按下電源鍵關閉屏幕
  • 啟動新的Activity
  • 橫豎屏切換時,肯定會執(zhí)行肾请,因為橫豎屏切換的時候會先銷毀Act留搔,然后再重新創(chuàng)建 重要原則:當系統(tǒng)"未經(jīng)你許可"時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調用铛铁, 這是系統(tǒng)的責任隔显,因為它必須要提供一個機會讓你保存你的數(shù)據(jù)(你可以保存也可以不保存)却妨。

而后一個方法,和onCreate同樣可以從取出前者保存的數(shù)據(jù): 一般是在onStart()和onResume()之間執(zhí)行括眠! 之所以有兩個可以獲取到保存數(shù)據(jù)的方法彪标,是為了避免Act跳轉而沒有關閉, 然后不走onCreate()方法掷豺,而你又想取出保存數(shù)據(jù)~

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來實現(xiàn) 這個是通過Intent的 intent-filter來實現(xiàn)的生年,這個Intent那章會詳細講解婴程! 這里知道個大概就可以了!

3. 另外還有一個直接通過包名啟動apk的:

Intent intent = getPackageManager().getLaunchIntentForPackage
("apk第一個啟動的Activity的全限定類名") ;
if(intent != null) startActivity(intent) ;

5.橫豎屏切換與狀態(tài)保存的問題

前面也也說到了App橫豎屏切換的時候會銷毀當前的Activity然后重新創(chuàng)建一個抱婉,你可以自行在生命周期 的每個方法里都添加打印Log的語句档叔,來進行判斷,又或者設一個按鈕一個TextView點擊按鈕后蒸绩,修改TextView 文本衙四,然后橫豎屏切換,會神奇的發(fā)現(xiàn)TextView文本變回之前的內(nèi)容了患亿! 橫豎屏切換時Act走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume

關于橫豎屏切換可能遇到下述問題:
1.先說下如何禁止屏幕橫豎屏自動切換吧传蹈,很簡單,在AndroidManifest.xml中為Act添加一個屬性: android:screenOrientation步藕, 有下述可選值:
  • unspecified:默認值 由系統(tǒng)來判斷顯示方向.判定的策略是和設備相關的惦界,所以不同的設備會有不同的顯示方向。
  • landscape:橫屏顯示(寬比高要長)
  • portrait:豎屏顯示(高比寬要長)
  • user:用戶當前首選的方向
  • behind:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
  • sensor:有物理的感應器來決定咙冗。如果用戶旋轉設備這屏幕會橫豎屏切換沾歪。
  • nosensor:忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了("unspecified"設置除外)雾消。
2.橫豎屏時想加載不同的布局:

1)準備兩套不同的布局灾搏,Android會自己根據(jù)橫豎屏加載不同布局: 創(chuàng)建兩個布局文件夾:layout-land橫屏,layout-port豎屏 然后把這兩套布局文件丟這兩文件夾里,文件名一樣立润,Android就會自行判斷狂窑,然后加載相應布局了!
2 )自己在代碼中進行判斷桑腮,自己想加載什么就加載什么:
我們一般是在onCreate()方法中加載布局文件的蕾域,我們可以在這里對橫豎屏的狀態(tài)做下判斷,關鍵代碼如下:

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. 狀態(tài)保存問題:

這個上面也說過了,通過一個Bundle savedInstanceState參數(shù)即可完成采呐! 三個核心方法:
onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);
你只重寫onSaveInstanceState()方法若锁,往這個bundle中寫入數(shù)據(jù),比如:

outState.putInt("num",1);

這樣斧吐,然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存儲的數(shù)據(jù)又固,不過拿之前要判斷下是否為null哦!

savedInstanceState.getInt("num");

然后想干嘛就干嘛~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤率,一起剝皮案震驚了整個濱河市仰冠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝶糯,老刑警劉巖洋只,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昼捍,居然都是意外死亡识虚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門妒茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担锤,“玉大人,你說我怎么就攤上這事乍钻「匮” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵银择,是天一觀的道長育拨。 經(jīng)常有香客問我,道長欢摄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任笋粟,我火速辦了婚禮怀挠,結果婚禮上,老公的妹妹穿的比我還像新娘害捕。我一直安慰自己绿淋,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布尝盼。 她就那樣靜靜地躺著吞滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裁赠,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天殿漠,我揣著相機與錄音,去河邊找鬼佩捞。 笑死绞幌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的一忱。 我是一名探鬼主播莲蜘,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘营!你這毒婦竟也來了票渠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缓苛,沒想到半個月后广恢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡择诈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了出皇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞芍。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郊艘,靈堂內(nèi)的尸體忽然破棺而出荷科,到底是詐尸還是另有隱情,我是刑警寧澤纱注,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布畏浆,位于F島的核電站,受9級特大地震影響狞贱,放射性物質發(fā)生泄漏刻获。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一瞎嬉、第九天 我趴在偏房一處隱蔽的房頂上張望蝎毡。 院中可真熱鬧,春花似錦氧枣、人聲如沸沐兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎谎。三九已至碳想,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毁靶,已是汗流浹背胧奔。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留老充,地道東北人葡盗。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像啡浊,于是被迫代替她去往敵國和親觅够。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容