★04.Activity

項(xiàng)目里添加Activity

  • Activity對(duì)應(yīng)的 Java 文件
  • AndroidManifest.xml
  • 對(duì)應(yīng)的界面 XML
  • 界面 XML 用到的資源

Activity及其派生類

繼承圖

簡(jiǎn)介

簡(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)用棧頂ActivityonNewIntent()氓癌。
  • singleTask
    • 在原任務(wù)棧中創(chuàng)建新Activity谓谦,不會(huì)創(chuàng)建新棧。
    • 啟動(dòng)新Activity時(shí)贪婉,若任務(wù)棧中已經(jīng)存在相同的Activity反粥,就會(huì)銷毀任務(wù)棧中這個(gè)Activity之上的所有Activity,并調(diào)用該ActivityonNewIntent()疲迂。
  • singleInstance
    • 在新的任務(wù)棧中創(chuàng)建新的Activity才顿。
    • 在新任務(wù)棧中只能有這一個(gè)相同或不同的Activity

常見技巧

  • 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)用拘悦。
  • 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)SerializableParcelable接口的對(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ù)

  1. 啟動(dòng)Activity時(shí),給Activity一個(gè)請(qǐng)求標(biāo)識(shí)符:
    startActivityForResult(i, REQUEST_CODE);
    
  2. 在被調(diào)用的Activity中設(shè)置結(jié)果组砚,調(diào)用者會(huì)接受到此結(jié)果:
    Intent data = new Intent();
    data.putExtra(/* data */);
    setResult(RESULT_OK, data);
    
  3. 被調(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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市罐农,隨后出現(xiàn)的幾起案子条霜,更是在濱河造成了極大的恐慌,老刑警劉巖涵亏,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宰睡,死亡現(xiàn)場(chǎng)離奇詭異蒲凶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夹厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門豹爹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人矛纹,你說(shuō)我怎么就攤上這事臂聋。” “怎么了或南?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵孩等,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我采够,道長(zhǎng)肄方,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任蹬癌,我火速辦了婚禮权她,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逝薪。我一直安慰自己隅要,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布董济。 她就那樣靜靜地躺著步清,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虏肾。 梳的紋絲不亂的頭發(fā)上廓啊,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音封豪,去河邊找鬼谴轮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吹埠,可吹牛的內(nèi)容都是我干的第步。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼藻雌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雌续!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胯杭,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驯杜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后做个,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸽心,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滚局,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顽频。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤肢。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糯景,靈堂內(nèi)的尸體忽然破棺而出嘁圈,到底是詐尸還是另有隱情,我是刑警寧澤蟀淮,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布最住,位于F島的核電站,受9級(jí)特大地震影響怠惶,放射性物質(zhì)發(fā)生泄漏涨缚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一策治、第九天 我趴在偏房一處隱蔽的房頂上張望脓魏。 院中可真熱鬧,春花似錦通惫、人聲如沸茂翔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)檩电。三九已至拄丰,卻和暖如春府树,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背料按。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工奄侠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人载矿。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓垄潮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闷盔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弯洗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 引言:這篇文章牡整,大概分析下Fragment的生命周期、實(shí)際應(yīng)用方法以及使用Fragment時(shí)需要注意的地方溺拱,算是F...
    androidjp閱讀 12,882評(píng)論 10 104
  • Fragment文檔 簡(jiǎn)單示例 說(shuō)明 Activity通過(guò)一個(gè)FrameLayout來(lái)安排Fragment在Act...
    iDragonfly閱讀 245評(píng)論 0 0
  • 《Android Fragment完全解析逃贝,關(guān)于碎片你所需知道的一切》 我們都知道谣辞,Android上的界面展示都是...
    cxm11閱讀 2,186評(píng)論 2 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,164評(píng)論 25 707
  • 這是女兒第一次聽我當(dāng)眾彈奏古琴沪摄。擔(dān)心她一 個(gè)人坐在那里會(huì)哭鬧躯嫉,害怕,畢竟只有2歲杨拐。古琴跟人心最知心和敬,慌亂的心情暴露...
    文姐28101閱讀 259評(píng)論 1 2