Activity的簡單應用:
創(chuàng)建類,繼承Activity
重寫Activity的onCreate(Bundle saveInstanceState)方法
在onCreate()方法中第一行是:super.onCreate(..)
在AndroidManifest清單文 件中配置:
在<application>標簽中,使用<activity>標簽
android:name屬性指定創(chuàng)建的Activity類
android:label設置Activity的標題
android:icon屬性設置Acitivity的標題圖標
android:screenOrientation屬性設置窗口屏幕方向
landscape:限制界面為橫屏,旋轉屏幕也不會改變當前狀態(tài)。
portrait:限制界面為豎屏,旋轉屏幕也不會改變當前狀態(tài)。
sensor:根據(jù)傳感器定位方向,旋轉手機90度,180,270,360,界面都會發(fā)生變化。
sensorLandscape:(橫屏的旋轉,不會出現(xiàn)豎屏的現(xiàn)象)根據(jù)傳感器定位方向,旋轉手機180度 界面旋轉。一般橫屏游戲會是這個屬性。
sensorPortrait:(豎屏的旋轉,不會出現(xiàn)橫屏的現(xiàn)象)根據(jù)傳感器定位方向,旋轉手機180度界面會 旋轉。
unspecified:由系統(tǒng)選擇顯示方向,不同的設備可能會有所不同(旋轉手機,界面會跟著旋轉)
user:用戶當前的首選方向。
nosensor:不由傳感器確定方向。旋轉設備的時候界面不會跟著旋轉。初始界面方向由系統(tǒng)提供。
如設置Activity為對話框樣式:
android:theme="@android:style/Theme.Dialog"
代碼中:
//修改Activity窗口的寬度與高度
WindowManager.LayoutParams wParam=getWindow().getAttributes();
wParam.height=400;
wParam.width=400;
getWindow().setAttributes(wParam);
Activity的四種傳值方法:
1.Intent
putExtra(String key,value) getStringExtra("key")
Bundle: 類似于HashMap的集合類
Intent.putExtras(Bundle)/getExtras()
如何傳送和獲取類對象:類必須實現(xiàn)Serializable序列化接口
3.Application全局對象
1.創(chuàng)建類,繼承Application類
2.在類中定義Activity間傳值的對象或方法
3.在清單配置文件<application>標簽中使用android:name屬性引用Application類
4.通過Activity.getApplication()獲取Application對象
5.將Application強轉成自定義的Application類
6.調用全局對象或方法設置或獲取數(shù)據(jù)
靜態(tài)成員(不推薦使用)
startActivityForResult
一般用于拍照、錄像、二維碼掃描
注意:
Intent傳遞對象,該對象的類,要實現(xiàn)序列化接口(即:Serializable),獲得該對象的時候,要使用 getSerializableExtra()方法
Activity的生命周期:
七大生命周期方法
onCreate() 第一次創(chuàng)建時執(zhí)行
onStart() 顯示窗口時執(zhí)行
onResume() 可獲取用戶焦點時執(zhí)行
onPause() 失去用戶焦點時執(zhí)行
onStop() 關閉窗口時執(zhí)行
onRestart() 重新顯示窗口時執(zhí)行
onDestroy() 銷毀時執(zhí)行
生命周期的作用
①當用戶接一個電話或切換到另一個程序不會崩潰
②當用戶后臺運行程序時不會銷毀有價值的系統(tǒng)資源
③當用戶離開再返回你的應用時不會丟失用戶的進程
④當手機屏幕進行橫豎屏切換的時候不會崩潰或者丟掉用戶的進程
Activity四個生命周期階段
開始Activity: onCreate()->onStart()->onResume()
失去焦點: onPause()->onStop()
重新獲取焦點: onRestart()->onStart()->onResume()
關閉Activity: onPause()->onStop()->onDestroy()
Activity周期歷程:
開始Activity: onCreate()->onStart()->onResume()
失去焦點: onPause()->onStop()
重新獲取焦點: onRestart()->onStart()->onResume()
關閉Activity: onPause()->onStop()->onDestroy()
第一次啟動:
onCreate--->onStart---->onResume
A頁面跳轉到B頁面:
onPause---->onStop
打電話:
onPause---->onStop--->掛斷電話--->onRestart--->onStart--->onResume
按下Home鍵/鎖屏:
onPause---->onStop
打開主界面,HOME鍵退出,再次啟動app
onPause---->onStop--->onRestart--->onStart--->onResume
豎屏切換為橫屏:
onPause---->onStop--->onDestory--->onCreate--->onStart--->onResmue
現(xiàn)場保護(保存狀態(tài))
onSaveInstanceState(Bundle)
(1)、當用戶按下HOME鍵時。
(2)、長按HOME鍵,選擇運行其他的程序時。
(3)、按下電源按鍵(關閉屏幕顯示)時。
(4)、從activity A中啟動一個新的activity時。
(5)、屏幕方向切換時,例如從豎屏切換到橫屏時。
調用onSaveInstanceState時機
onCreate(Bundle)
onRestoreInstanceState(Bundle)
現(xiàn)場恢復時,二者任選其一
一、為什么要做現(xiàn)場保護:
1、Activity在生命周期中的Paused狀態(tài)或Stoped狀態(tài)下,內存空間緊張的時,系統(tǒng)很可能會干掉Activity,如果用戶通過導航再返回剛被干掉的Activity,系統(tǒng)只能創(chuàng)建新的Activity,如果之前的Activity界面已有用戶錄入信息,如用戶名和密碼等,而在新的Activity中則沒有了,這種時間就需要做現(xiàn)場保護
2、橫屏與豎屏切換時,生命周期變化如下:
onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
如果當前窗口中已錄入部分信息,而用戶不小心切換橫豎屏,此時需要做現(xiàn)場保護。
二、調用時機,如下圖所示:

橫屏豎屏
1、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次
2、設置Activity的android:configChanges="keyboardHidden"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次
3、置Activity的android:configChanges="orientation|screenSize|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法
設置屏幕方向:android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize"
Task和BackStack
概念
一、總結性知識點:
1、Android應用運行時會創(chuàng)建任務Task,用于存放主窗口
2、每一個任務包含一個堆棧數(shù)據(jù)結構,用于保存當前應用已創(chuàng)建的窗口對象,這個堆棧即回退棧BackStack
3? 位于回退棧頂?shù)拇翱跁幱诮裹c狀態(tài)
4? 窗口的顯示與關閉即是入棧與出棧的過程
二、詳細描述
(一)、任務Task:
1、概念:
一個任務(task)就是在執(zhí)行某項工作時與用戶進行交互的Activity的集合。這些Activity按照被打開的順序依次被安排在一個堆棧中(回退棧)。
2、主屏頁面:
設備的主屏是大多數(shù)任務的啟動位置,當用戶觸摸一個應用程序啟動器圖標(或者app快捷圖標),應用程序的任務就會在前臺顯示。如果相關應用程序的任務不存在,那么就會有一個新的任務被創(chuàng)建,并且應用程序打開的“主”Activity會作為任務中的根Activity。
(二)、回退棧:
在當前的Activity啟動了另一個Activity時,這個新的Activity被放到了堆棧的頂部,并且?guī)в薪裹c。
前一個Activity并沒有消失,而是保存在回退棧中,此時它處于停止狀態(tài)。
當用戶按下回退按鈕時,當前的Activity會被從回退棧的頂部彈出(這個Activity被銷毀),而前一個Activity被恢復。堆棧中的Activity不會被重新排列。因此,回退棧的操作跟后進先出的對象結構是一樣的。
在用戶按下回退按鈕時,當前Activity被銷毀,并且前一個Activity被恢復。如果用戶繼續(xù)按回退按鈕,那么回退棧中的每個Activity會被依次彈出,前一個Activity會被顯示,直到用戶返回主屏(或者返回到任務開始時運行的那個Activity)。當所有的Activity從回退棧中被刪除時,這個任務就不再存在了。
(三)、Activity和Task的默認行為的總結:
1、當Activity A啟動Activity B時,ActivityA被終止,但是系統(tǒng)保留了它的狀態(tài)(如滾動條的位置和錄入表單的文本)。如果用戶在Activity B中按回退按鈕,Activity A會使用被保存的狀態(tài)來進行恢復。
2、當用戶通過按主頁(Home)按鈕離開一個任務時,當前的Activity會被終止,并且被放入后臺。系統(tǒng)會保留任務中每個Activity的狀態(tài)。如果用戶隨后通過選擇啟動圖標來恢復這個任務,那么任務會來到前臺,并且恢復了堆棧頂部的Activity。
3、如果用戶按下回退按鈕,當前的Activity會從堆棧中被彈出并且被銷毀。堆棧中的前一個Activity會被恢復。Activity被銷毀時,系統(tǒng)不會保留Activity的狀態(tài)。
4、Activity能夠被實例化多次,甚至來自其他任務。
運行模式
standard:默認,窗口類可以實例化多次
singleTop:
如果調用窗口在棧頂,則返回窗口對象,并直接使用并調用onNewIntent,反之同standard的作用一樣,依然創(chuàng)建新的對象,比如,當前棧中窗口:A-B-C-D,D為棧頂,此時startActivity顯示D,則直接顯示棧頂?shù)腄,而不會創(chuàng)建新的D,如果startActivity顯示B,因為B不在棧頂,則創(chuàng)建新的B并壓入棧中,此時棧:A-B-C-D-B
singleTask
保證一個窗口類在多個回退棧中只能有一個實例;創(chuàng)建模式分如下4種情況:
1、調用同一個應用程序中singleTask模式的窗口,并且該窗口不存在,系統(tǒng)會創(chuàng)建窗口的對象,并將該窗口對象壓入當前的回退棧中(不會創(chuàng)建新的任務)
2、調用同一個應用程序中singleTask模式的窗口,窗口存在且在棧頂,則直接調用onNewIntent();如果存在且不在頂棧,同樣也調用onNewIntent()并彈出其上所有的窗口對象(這些對象會被釋放),以保證窗口獲取焦點。
3、調用另一個應用程序中的singleTask窗口,如果對象不存在,會創(chuàng)建新的窗口對象后,將其壓入(Activity所屬的應用)回退棧中,做為頂部元素。
當返回鍵時,下一個顯示的頁面是b回退棧中當前窗口的下一個位置
注意:此時涉及到兩個任務(回退棧)的操作。
4、調用另一個應用程序中的singleTask窗口,如果對象已存在,系統(tǒng)會切換到窗口所在的任務,如果不在棧頂,同第2種情況一樣,將其上面的對象進行出棧與釋放。
singleInstance
與singleTask作用基本相同,但在新創(chuàng)建的Task中只能存在一個Activity
注意:這種用法并不多而且浪費空間,所以不建議使用。
啟動Acivity
startActivity(Intent i);
startActivityForResult(Intent i,int requestCode)
作用:使用startActivityForResult啟動的Activity在銷毀的時候可以給啟動他的Activity回傳信息
使用:
效果使用AActivity啟動BActivity,當BActivity銷毀的時候給AActivity回傳信息
1,在AActivity使用該方法啟動Activity
2,在AActivity中重寫的onActivityResult(int requestCode, int resultCode, Intent data)方法
1,比較請求碼和響應碼是否一致
2,對回傳信息做處理
3,在BActivity中使用setResult(int resultCode,Intent i)方法回傳意圖
示例:
啟動順序:A-B-C-D-A-B-C
任務1:A-B-C-A-B-- 打開C:A-B-C
任務2:D
回退順序:
C-B-A-D
這2個任務都屬于同一個應用程序
一個App可能會有多個任務
同一個任務中,可能存儲不同App的Activity對象