定義:
Android四大組件之一,提供界面和用戶交互(如滑動(dòng)、點(diǎn)擊等)
說(shuō)明:
首先必須在AMF注冊(cè),然后我們開(kāi)始下面的學(xué)習(xí)吧。
1. 老生常談的生命周期和四種狀態(tài)
七個(gè)生命周期方法的特點(diǎn)
onCreate:創(chuàng)建時(shí)調(diào)用
onStart:可見(jiàn),但是沒(méi)焦點(diǎn)
onResume:得到焦點(diǎn)
onPause:依然可見(jiàn).但是失去焦點(diǎn)
onStop:已經(jīng)不可見(jiàn)
onDestroy:銷(xiāo)毀了 前六個(gè)狀態(tài)方法
onRestart:重啟
當(dāng)系統(tǒng)內(nèi)存不足時(shí),之前啟動(dòng)但未退出的進(jìn)程,會(huì)被系統(tǒng)殺死,根據(jù)LRU(最近最少使用)算法確定殺死哪個(gè)進(jìn)程
Activity被銷(xiāo)毀,進(jìn)程并不會(huì)被銷(xiāo)毀,這是為了下一次啟動(dòng)更快
1.1、Activity四種狀態(tài)
runing ?交互狀態(tài) ?對(duì)應(yīng) onResume
paused 對(duì)應(yīng) onPause
stopped ?對(duì)面 OnStop
killed ?已經(jīng)被干死了
2. 啟動(dòng)方式(跳轉(zhuǎn)方式)
啟動(dòng)方式分為顯示啟動(dòng)和隱式啟動(dòng)
顯示啟動(dòng):效率較高 常用啟動(dòng)方式
Intent intent=new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
隱式啟動(dòng):通過(guò)動(dòng)作跳轉(zhuǎn) 一般用于調(diào)用系統(tǒng)應(yīng)用(如:報(bào)號(hào)器等)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);//啟動(dòng)系統(tǒng)自帶的撥號(hào)器應(yīng)用
startActivity(intent);
2.1 有回調(diào)的跳轉(zhuǎn) ?startActivityForResult
A(Activity)-----跳轉(zhuǎn)----->B(Activity)
Intent intent = new Intent();
intent.setClass(this, B.class);
startActivityForResult(intent, requestCode);//開(kāi)啟activity并且獲取返回值
B (Activity)
Intent data = new Intent();
data.putExtra("phone", phone);
setResult(0, data); ?//回傳數(shù)據(jù)
A? ? (Activity)
//通過(guò)data獲取返回的數(shù)據(jù) ?B窗口關(guān)閉 ?A窗口運(yùn)行一下方法
onActivityResult(int requestCode, int resultCode, Intent data) {
。。。。。。//處理回調(diào)的數(shù)據(jù)
}
2.2 Activity跳轉(zhuǎn)生命周期的變法
下圖紅框內(nèi)的是A的生命周期,這是正常情況下。
我們知道當(dāng)Activity界面被旋轉(zhuǎn),Activity會(huì)重新創(chuàng)建。
解決:在AMF的Activity中添加android:configChanges="orientation|screenSize"。
(android:configChanges="orientation|keyboardHidden",這個(gè)是較低版本的安卓系統(tǒng)的情況,4.0之后的版本要加上 screenSize 才有效。)
實(shí)際開(kāi)發(fā)中我們一般都是不允許Activity旋轉(zhuǎn),這樣既能保證Activity不被重新創(chuàng)建,也能保證布局的適配,當(dāng)然也更適合我們使用手機(jī)的習(xí)慣。
解決:第一種在AMF中添加 android:screenOrientation="portrait"
第二種在代碼中設(shè)置setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
PS:screenOrientation的幾個(gè)參數(shù)
"unspecified":默認(rèn)值 由系統(tǒng)來(lái)判斷顯示方向.判定的策略是和設(shè)備相關(guān)的,所以不同的設(shè)備會(huì)有不同的顯示方向.
"landscape":橫屏顯示(寬比高要長(zhǎng))
"portrait":豎屏顯示(高比寬要長(zhǎng))
"user":用戶當(dāng)前首選的方向
"behind":和該Activity下面的那個(gè)Activity的方向一致(在Activity堆棧中的)
"sensor":有物理的感應(yīng)器來(lái)決定。如果用戶旋轉(zhuǎn)設(shè)備這屏幕會(huì)橫豎屏切換。
"nosensor":忽略物理感應(yīng)器,這樣就不會(huì)隨著用戶旋轉(zhuǎn)設(shè)備而更改了("unspecified"設(shè)置除外)。
還有一種情況就是Activity被系統(tǒng)回收,加入被回收的Activity叫A,那么當(dāng)我們從B回到A時(shí),A會(huì)重新創(chuàng)建。
3.啟動(dòng)模式
Activity有四中啟動(dòng)模式
Standard:默認(rèn)啟動(dòng)模式先進(jìn)后出
SingleTop:棧頂模式當(dāng)前Activity在棧頂(實(shí)例),那么就不會(huì)再創(chuàng)建了, 如果不在棧頂 會(huì)創(chuàng)建 新的Activity
SingleTask:任務(wù)棧模式當(dāng)前棧只能存在一個(gè)實(shí)例。當(dāng)前Activity在棧頂(實(shí)例),那么就不會(huì)再創(chuàng)建了;
如果不在棧頂,則會(huì)跳轉(zhuǎn)到實(shí)例Activity,實(shí)際上是殺死棧中該Activity上方的所有Activity,讓其成為棧頂Activity
SingleInstance:實(shí)例模式保證整個(gè)手機(jī)內(nèi)存中都只有一個(gè)該Activity的實(shí)例。 每次創(chuàng)建都是在一個(gè)新的棧里創(chuàng)建Activity
4. 擴(kuò)展
4.1 scheme跳轉(zhuǎn)協(xié)議
Android中的scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議,通過(guò)定義自己的scheme協(xié)議,可以跳轉(zhuǎn)到app中的各個(gè)頁(yè)面
服務(wù)器可以定制化告訴app跳轉(zhuǎn)哪個(gè)頁(yè)面,App可以通過(guò)跳轉(zhuǎn)到另一個(gè)App頁(yè)面
可以通過(guò)H5頁(yè)面跳轉(zhuǎn)頁(yè)面(如:花生米地鐵wifi)
使用方法:AMS中的Activity添加一個(gè)過(guò)濾器
Activity獲取外部跳轉(zhuǎn)的消息
Intent intent =getIntent();
Log.e(TAG, "scheme:" +intent.getScheme());
Uri uri =intent.getData();
Log.e(TAG, "scheme: "+uri.getScheme());
Log.e(TAG, "host: "+uri.getHost());
Log.e(TAG, "port: "+uri.getPort());