項(xiàng)目里添加Activity
-
Activity
對(duì)應(yīng)的 Java 文件 - AndroidManifest.xml
- 對(duì)應(yīng)的界面 XML
- 界面 XML 用到的資源
Activity
及其派生類
繼承圖
簡(jiǎn)介
-
Activity:提供
Fragment
功能蒲讯。 -
FragmentActivity:提供
Fragment
功能和ActionBar
功能。 -
AppCompatActivity:提供
ActionBar
功能灰署。 - ActionBarActivity:deprecated
簡(jiǎn)單示例
AndroidManifest.xml
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
啟動(dòng)模式
-
standard
:- 默認(rèn)模式判帮,可以不用寫配置。
- 在原任務(wù)棧中創(chuàng)建新
Activity
溉箕,不會(huì)創(chuàng)建新棧晦墙。 - 可以有多個(gè)相同或不同的
Activity
。
-
singleTop
:- 在原任務(wù)棧中創(chuàng)建新
Activity
肴茄,不會(huì)創(chuàng)建新棧晌畅。 - 可以有多個(gè)相同
Activity
。 - 如果
Activity
在任務(wù)棧頂?shù)臅r(shí)候寡痰,啟動(dòng)與棧頂相同的Activity
時(shí)踩麦,不會(huì)創(chuàng)建新的Activity
,而會(huì)調(diào)用棧頂Activity
的onNewIntent()
氓癌。
- 在原任務(wù)棧中創(chuàng)建新
-
singleTask
:- 在原任務(wù)棧中創(chuàng)建新
Activity
谓谦,不會(huì)創(chuàng)建新棧。 - 啟動(dòng)新
Activity
時(shí)贪婉,若任務(wù)棧中已經(jīng)存在相同的Activity
反粥,就會(huì)銷毀任務(wù)棧中這個(gè)Activity
之上的所有Activity
,并調(diào)用該Activity
的onNewIntent()
疲迂。
- 在原任務(wù)棧中創(chuàng)建新
-
singleInstance
:- 在新的任務(wù)棧中創(chuàng)建新的
Activity
才顿。 - 在新任務(wù)棧中只能有這一個(gè)相同或不同的
Activity
。
- 在新的任務(wù)棧中創(chuàng)建新的
常見技巧
- 在
onCreate()
中檢查savedInstanceState
是否為null
尤蒿,若是則代表著Activity
是第一次加載郑气,同樣的技巧在Fragment
中也是可用的。 - 通過(guò)
getIntent()
來(lái)獲取調(diào)用時(shí)傳入的數(shù)據(jù)腰池。
常用方法
通過(guò)重寫使用
-
onActivityReenter()
:點(diǎn)擊返回鍵時(shí)尾组,重新進(jìn)入父Activity
時(shí)調(diào)用忙芒,會(huì)接收到在子Activity
中調(diào)用setResult()
時(shí)傳送的數(shù)據(jù)。 -
onActivityResult()
:在子Activity
中調(diào)用setResult()
讳侨,然后退出子Activity
時(shí)呵萨,父Activity
會(huì)接收到在setResult()
中設(shè)置的數(shù)據(jù)。 -
finishAfterTransition()
:在退場(chǎng)動(dòng)畫結(jié)束后執(zhí)行finish()
跨跨,通過(guò)重寫來(lái)決定在退場(chǎng)動(dòng)畫結(jié)束與調(diào)用finish()
之間需要做的東西潮峦。
直接調(diào)用
-
postponeEnterTransition()
:- 當(dāng)通過(guò)
ActivityOptions.makeSceneTransitionAnimation()
啟動(dòng)Activity
時(shí),延遲開始轉(zhuǎn)場(chǎng)動(dòng)畫勇婴,直至調(diào)用startPostponedEnterTransition()
忱嘹。 - 若沒有通過(guò)
ActivityOptions.makeSceneTransitionAnimation()
啟動(dòng)Activity
,則此函數(shù)什么都不做耕渴。 - 在
onCreate()
或onActivityReenter()
中調(diào)用拘悦。
- 當(dāng)通過(guò)
-
startPostponedEnterTransition()
:開始轉(zhuǎn)場(chǎng)動(dòng)畫。
生命周期
- 打開
onCreate()
onStart()
onResume()
- 進(jìn)入后臺(tái)
onPause()
onStop()
- 進(jìn)入前臺(tái)
onRestart()
onStart()
onResume()
- 應(yīng)用程序配置發(fā)生改變(橫豎屏切換)
onPause()
onStop()
onDestrory()
onCreate()
onStart()
onResume()
- 退出
onPause()
onStop()
onDestrory()
橫豎屏布局
通過(guò)創(chuàng)建默認(rèn)方向layout
文件和橫向layout
文件來(lái)實(shí)現(xiàn)萨螺。
保存Activity
數(shù)據(jù)
- 只能保存基本數(shù)據(jù)類型和實(shí)現(xiàn)
Serializable
或Parcelable
接口的對(duì)象窄做。 - 應(yīng)用配置改變時(shí)會(huì)調(diào)用
onSaveInstanceState()
愧驱。 -
保存:重寫
onSaveInstanceState()
慰技。@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_INDEX, mCurrentIndex); }
-
讀取:在
onCreate()
中恢復(fù)數(shù)據(jù)if (savedInstanceState != null) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); }
啟動(dòng)Activity
準(zhǔn)備
- 被啟動(dòng)的活動(dòng)必須具有的意圖篩選器:
<category android:name="android.intent.category.DEFAULT"/>
方式一
startActivity(new Intent(".MainActivity"));
方式二
startActivity(new Intent(this, MainActivity.class));
Activity
通信
傳入數(shù)據(jù)
- 調(diào)用的
Activity
Intent i = new Intent(this, CheatActivity.class); i.putExtra(/* data */); startActivity(i);
- 被調(diào)用的
Activity
mAnswerIsTrue = getIntent().getBooleanExtra(/* data */);
返回?cái)?shù)據(jù)
- 啟動(dòng)
Activity
時(shí),給Activity
一個(gè)請(qǐng)求標(biāo)識(shí)符:startActivityForResult(i, REQUEST_CODE);
- 在被調(diào)用的
Activity
中設(shè)置結(jié)果组砚,調(diào)用者會(huì)接受到此結(jié)果:Intent data = new Intent(); data.putExtra(/* data */); setResult(RESULT_OK, data);
- 被調(diào)用的
Activity
結(jié)束后會(huì)回調(diào) 調(diào)用者 的onActivityResult()
吻商,數(shù)據(jù)會(huì)通過(guò)Intent
傳回,可以根據(jù)請(qǐng)求標(biāo)識(shí)符解析傳回的Intent
:@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == REQUEST_CODE) { if (data == null) { return; } // 解析數(shù)據(jù) data.getBooleanExtra(/* data */); } }
封裝newIntent()
靜態(tài)方法
- 通過(guò)在被調(diào)用的
Activity
中封裝newIntent()
靜態(tài)方法糟红,使得被調(diào)用的Activity
來(lái)決定如何被調(diào)用:public static Intent newIntent(Context packageContext, Data data) { Intent intent = new Intent(packageContext, MyActivity.class); intent.putExtra(ID, data); return intent; }
注意事項(xiàng)
- 相比與
onResume()
艾帐,onStart()
不一定會(huì)執(zhí)行。 -
Activity
中的實(shí)例變量不可靠盆偿,生命期比Activity
長(zhǎng)的實(shí)例變量應(yīng)該盡量存在外部柒爸。 - 確保所有
Activity
都是AppCompatActivity
的子類,這樣兼容性會(huì)很高事扭。 - 后退按鈕導(dǎo)航和層級(jí)導(dǎo)航(向上按鈕導(dǎo)航)并不一樣捎稚。層級(jí)導(dǎo)航是開始一個(gè)新的
Activity
,彈出回退棧里此Activity
以上的Activity
求橄。后退按鈕導(dǎo)航則是彈出回退棧里最頂層的Activity
今野。
Activity
的XML屬性
<activity android:allowEmbedded=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:autoRemoveFromRecents=["true" | "false"]
android:banner="drawable resource"
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale",
"uiMode", "orientation", "screenSize",
"smallestScreenSize"]
android:documentLaunchMode=["intoExisting" | "always" |
"none" | "never"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["standard" | "singleTop" |
"singleTask" | "singleInstance"]
android:maxRecents="integer"
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:parentActivityName="string"
android:permission="string"
android:process="string"
android:relinquishTaskIdentity=["true" | "false"]
android:resizeableActivity=["true" | "false"]
android:screenOrientation=["unspecified" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
"sensorLandscape" | "sensorPortrait" |
"userLandscape" | "userPortrait" |
"sensor" | "fullSensor" | "nosensor" |
"user" | "fullUser" | "locked"]
android:stateNotNeeded=["true" | "false"]
android:supportsPictureInPicture=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
</activity>