《Android第一行代碼》first reading 三

活動的生命周期

當(dāng)你深入理解活動的生命周期之后强戴,就可以寫出更加連貫流暢的程序挖诸,并在如何合理管理應(yīng)用資源方面發(fā)揮的游刃有余狠轻。

返回棧

首先它是一個棧(后進(jìn)先出)展氓。
Android中的活動是可以層疊的侮繁,每一個新建的活動都會覆蓋在上一個活動上色徘。銷毀只會銷毀最上層的活動各薇。

活動狀態(tài)

每個活動在其生命周期中最多會有4種狀態(tài)

  1. 運(yùn)行狀態(tài) 當(dāng)一個活動位于返回棧的棧頂
  2. 暫停狀態(tài) 當(dāng)一個活動不再位于棧頂业岁,但仍然可見鳞仙。
  3. 停止?fàn)顟B(tài) 當(dāng)一個活動不再位于位于棧頂,并不可見叨襟。
  4. 銷毀狀態(tài) 當(dāng)一個活動從返回棧中移除就變成了銷毀狀態(tài)繁扎。
活動的生命周期
Android Developers上的圖片.png
完整生存期:

活動在onCreate()和onDestory()之間所經(jīng)歷的。一般情況下,一個活動會在onCreate()方法中完成各種初始化操作梳玫,在onDestory()中完成釋放內(nèi)存的操作爹梁。
onCreate() 每個活動都重寫了這個方法,它會在活動第一次被創(chuàng)建時調(diào)用提澎。你應(yīng)該在這個方法中完成活動的初始化操作姚垃。
onDestory() 這個方法在活動被銷毀時調(diào)用,調(diào)用后活動變?yōu)殇N毀狀態(tài)盼忌。

可見生存期

活動在onStart()和onStop()之間所經(jīng)歷的积糯。在可見生存期內(nèi),活動對于用戶中是可見的谦纱,即便有可能無法與用戶進(jìn)行交互看成。我們可以通過這兩個方法合理地管理那些對用戶可見的資源。比如在onStart()中對資源進(jìn)行加載跨嘉,在onStop() 中對資源進(jìn)行釋放川慌。
onStart() 這個方法在活動由不可見變?yōu)榭梢姇r調(diào)用
onStop() 這個方法在活動由可見變?yōu)椴豢梢姇r調(diào)用

前臺生存期

活動在onResume()到onPause()之間所經(jīng)歷的。在前臺生存期內(nèi)祠乃,活動總是處于運(yùn)行狀態(tài)的梦重,此時的活動是可以和用戶進(jìn)行交互的,我們平時看到和接觸最多的也就是這個狀態(tài)下的活動亮瓷。
onResume() 這個方法在系統(tǒng)準(zhǔn)備好和用戶進(jìn)行交互時調(diào)用琴拧。此時的活動已定位于返回棧的棧頂,并處于運(yùn)行狀態(tài)嘱支。
onPause() 這個方法在系統(tǒng)準(zhǔn)備去啟動或恢復(fù)另一個活動的時候調(diào)用蚓胸。我們通常會在這個方法中將一些消耗CPU的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù)斗塘,但這個方法的執(zhí)行速度一定要快赢织,不然會影響到新的棧頂活動的調(diào)用。

活動的啟動模式

在AndroidManifest.xml中設(shè)置其<activity>標(biāo)簽中的launchMode屬性

<activity android:name=".NormalActivity"
    android:launchMode="XXXX"/>

活動的啟動模式有四:

  • standard 默認(rèn)的模式就是此模式馍盟。在此模式下于置,活動的創(chuàng)建并不會做什么檢查,活動會重新創(chuàng)建一個贞岭。
  • singleTop 在此模式下八毯,活動創(chuàng)建時會檢測返回棧頂部是否為該活動,如果是的就不會再重新創(chuàng)建瞄桨。但是如果該活動并不存在于返回棧頂部话速,則依然會再次創(chuàng)建。
  • singleTask 在此模式下芯侥,活動創(chuàng)建前會遍歷返回棧泊交,如果返回棧中存在該活動就不會再創(chuàng)建新的乳讥。
  • singleInstance 在此模式下,活動在創(chuàng)建之前會先創(chuàng)建一個額外的返回棧廓俭,然后再在該額外的返回棧中創(chuàng)建活動云石。銷毀時,會先銷毀默認(rèn)的返回棧的活動并銷毀該返回棧研乒,再銷毀額外的返回棧和其活動汹忠。

幾個活動使用的技巧

知曉當(dāng)前是在哪一個活動中

先寫一個BaseActivity 基類繼承AppCompatActivity,并在此類中重寫onCreate()方法:

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
    }
}

我們在寫其他活動時都繼承此基類雹熬。當(dāng)我們進(jìn)入某個活動時宽菜,就會在logcat中輸出相應(yīng)的活動。

隨時隨地退出活動

新建一個ActivityCollector類作為活動管理器竿报,來對所有的活動進(jìn)行管理铅乡。

public class ActivityCollector{
    public static List<Activity> activities = new ArrayList<>();
    
    public static void addActivity(Activity){
        activitise.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for(Activity activity : activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

然后在BaseActivity中修改:

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

之后,如果想退出程序只要調(diào)用ActivityCollector.finishAll();
當(dāng)然還可以在銷毀所有活動的代碼后面再加上殺掉當(dāng)前進(jìn)程的代碼烈菌,以保證程序完全退出隆判,殺掉進(jìn)程的代碼如下:
android.os.Process.killProcess(android.os.Process.myPid());
killPeocess()方法用于殺掉一個進(jìn)程,它接收一個進(jìn)程的id參數(shù)僧界,我們可以通過myPid()方法來獲得當(dāng)前程序的進(jìn)程id。需要注意的是臭挽,killProcess()方法只能用于殺掉當(dāng)前程序的進(jìn)程,我們不能使用這個方法去殺掉其他程序捂襟。

啟動活動的最佳寫法
public class SecondActivity extends BaseActivity {
    public static void actionStart(Context context , String data1 , String data2){
        Intent intent = new Intent(context , SecondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }
}

我們在SecondActivity 中添加了一個actionStart()方法,在這個方法中完成了Intent的構(gòu)建欢峰,另外所有SecondActivity 中需要的數(shù)據(jù)都是通過actionStart()方法的參數(shù)傳遞葬荷。
SecondActivity.actionStart(FirstActivity.this , "data1" , "data2");

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纽帖,隨后出現(xiàn)的幾起案子宠漩,更是在濱河造成了極大的恐慌,老刑警劉巖懊直,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒吁,死亡現(xiàn)場離奇詭異,居然都是意外死亡室囊,警方通過查閱死者的電腦和手機(jī)雕崩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來融撞,“玉大人盼铁,你說我怎么就攤上這事〕①耍” “怎么了饶火?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵鹏控,是天一觀的道長。 經(jīng)常有香客問我肤寝,道長当辐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任醒陆,我火速辦了婚禮瀑构,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刨摩。我一直安慰自己寺晌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布澡刹。 她就那樣靜靜地躺著呻征,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罢浇。 梳的紋絲不亂的頭發(fā)上陆赋,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音嚷闭,去河邊找鬼攒岛。 笑死,一個胖子當(dāng)著我的面吹牛胞锰,可吹牛的內(nèi)容都是我干的灾锯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼嗅榕,長吁一口氣:“原來是場噩夢啊……” “哼顺饮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凌那,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤兼雄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帽蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赦肋,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年嘲碱,在試婚紗的時候發(fā)現(xiàn)自己被綠了金砍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡麦锯,死狀恐怖恕稠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扶欣,我是刑警寧澤鹅巍,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布千扶,位于F島的核電站,受9級特大地震影響骆捧,放射性物質(zhì)發(fā)生泄漏澎羞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一敛苇、第九天 我趴在偏房一處隱蔽的房頂上張望妆绞。 院中可真熱鬧,春花似錦枫攀、人聲如沸括饶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽图焰。三九已至,卻和暖如春蹦掐,著一層夾襖步出監(jiān)牢的瞬間技羔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工卧抗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留藤滥,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓社裆,卻偏偏與公主長得像超陆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浦马,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司张漂,掛了不少晶默,但最終還是拿到小米、百度航攒、阿里磺陡、京東、新浪漠畜、CVTE币他、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,239評論 11 349
  • 本篇文章主要介紹以下幾個知識點:顯示、隱式 Intent 的相關(guān)內(nèi)容憔狞;活動 Activity 的生命周期蝴悉;活動 A...
    開心wonderful閱讀 1,368評論 0 3
  • Day1: 在代碼中通過R.string.hello_world可以獲得該字符串的引用; 在XML中通過@stri...
    冰凝雪國閱讀 1,400評論 0 5
  • 有時候改變瘾敢,只需要別人當(dāng)頭棒喝的一句話拍冠。其實道理你都懂尿这,只是從別人嘴里說出來,更能讓自己發(fā)人深思罷了庆杜。有時候不愿意...
    Lisama閱讀 1,782評論 0 0