擼擼Android的羊毛(二)----Activity生命周期

轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/p/d78c53f4b1b9

前言

部分內(nèi)容參考Google爸爸的資料:
https://developer.android.google.cn/guide/components/activities?hl=zh-cn
最近由于部門的發(fā)展需要,加上就樓主一個(gè)一線開發(fā)人員,于是乎。慘被HR當(dāng)做苦力去做技術(shù)面試官。在其中樓主發(fā)現(xiàn),一些一兩年經(jīng)驗(yàn)的開發(fā)人員對(duì)于基礎(chǔ)的Android知識(shí)不是很了解,所以打算整理一下,面試中一些技術(shù)點(diǎn)和面試者對(duì)于一些問題自己新穎的看法,希望可以讓大家能夠升職加薪,走上人生巔峰。。。。
接上上一篇的文章,有喜歡的朋友可以回去查看:
擼擼Android的羊毛(一)----Activity啟動(dòng)模式
本篇將討論我們面試中經(jīng)常會(huì)被問的問題,Activity的生命周期。

1.什么是Activity

提到Activity,每個(gè)做Android開發(fā)的程序員都有自己的理解,“展示界面的”,“應(yīng)用的前端界面”,“功能和展示的實(shí)現(xiàn)面”...這里我們直接摘錄Google官網(wǎng)對(duì)于Activity的定義:

Activity是一個(gè)應(yīng)用組件,用戶可與其提供的屏幕進(jìn)行交互,以執(zhí)行撥打電話、拍攝照片、發(fā)送電子郵件或查看地圖等操作。 每個(gè) Activity 都會(huì)獲得一個(gè)用于繪制其用戶界面的窗口。窗口通常會(huì)充滿屏幕,但也可小于屏幕并浮動(dòng)在其他窗口之上。

2.如何創(chuàng)建Activity

要?jiǎng)?chuàng)建Activity,就必須繼承(extends)并實(shí)現(xiàn)其子類,這里我們直接使用系統(tǒng)原生的Activity,其他衍生類如FragmentActivity,AppCompatActivity也基本相似。

public class BActivity extends Activity {

    long value; // 保存從A傳遞過來的N值
    TextView valueTextView;
    TextView running;
    TextView result;
    long fab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 獲取到從A傳遞過來的值
        if (getIntent() != null && getIntent().hasExtra("value")) {
            value = getIntent().getLongExtra("value", 0);
        }
        setContentView(R.layout.b_activity);
        valueTextView = (TextView) findViewById(R.id.value);
        running = (TextView) findViewById(R.id.running);
        result = (TextView) findViewById(R.id.result);

        // 將獲取到的value設(shè)置到當(dāng)前的valueTextView控件上去
        valueTextView.setText(value + "");
        running.setVisibility(View.VISIBLE);
        new MyThread(value).start();
    }
}

這需要在onCreate方法中使用setContengtView()方法定義當(dāng)前Activity使用的界面。然后在AndroidManifest文件<application>下注冊(cè)Activity

<activity android:name=".BActivity ">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

android:name 屬性是唯一必需的屬性—它指定 Activity 的類名。應(yīng)用一旦發(fā)布,即不應(yīng)更改此類名,否則,可能會(huì)破壞諸如應(yīng)用快捷方式等一些功能。

3. Activity 生命周期

3.1 Activity三種存在狀態(tài)

在講到Activity的生命周期之前,我們先了解一下Activity的三種存在狀態(tài):

  • 繼續(xù)
    此 Activity 位于屏幕前臺(tái)并具有用戶焦點(diǎn)。(有時(shí)也將此狀態(tài)稱作“運(yùn)行中”。)

  • 暫停
    另一個(gè) Activity 位于屏幕前臺(tái)并具有用戶焦點(diǎn),但此 Activity 仍可見。也就是說,另一個(gè) Activity 顯示在此 Activity 上方,并且該 Activity 部分透明或未覆蓋整個(gè)屏幕。 暫停的 Activity 處于完全活動(dòng)狀態(tài)Activity對(duì)象保留在內(nèi)存中,它保留了所有狀態(tài)和成員信息,并與窗口管理器保持連接),但在內(nèi)存極度不足的情況下,可能會(huì)被系統(tǒng)終止。

  • 停止
    該 Activity 被另一個(gè) Activity 完全遮蓋(該 Activity 目前位于“后臺(tái)”)。 已停止的 Activity 同樣仍處于活動(dòng)狀態(tài)Activity 對(duì)象保留在內(nèi)存中,它保留了所有狀態(tài)和成員信息,但與窗口管理器連接)。 不過,它對(duì)用戶不再可見,在他處需要內(nèi)存時(shí)可能會(huì)被系統(tǒng)終止。

如果 Activity 處于暫停或停止?fàn)顟B(tài),系統(tǒng)可通過要求其結(jié)束(調(diào)用其 finish() 方法)或直接終止其進(jìn)程,將其從內(nèi)存中刪除。(將其結(jié)束或終止后)再次打開 Activity 時(shí),必須重建,也就是會(huì)重新調(diào)用onCreate方法。

3.2 Activity生命周期方法

Activity的生命周期有七個(gè)方法,這里google的網(wǎng)站已經(jīng)給出一張比較好的參考圖:
[圖片上傳失敗...(image-f8198b-1535094868734)]

我們使用一個(gè)表格對(duì)Activity生命周期中的七個(gè)方法做一個(gè)總結(jié),并且其中對(duì)每一種方法做了更詳細(xì)的描述,并說明了每一種方法在 Activity 整個(gè)生命周期內(nèi)的位置,包括在方法完成后系統(tǒng)能否終止 Activity。

方法 說明 是否能事后終止 后接
onCreate() 首次創(chuàng)建 Activity 時(shí)調(diào)用。 您應(yīng)該在此方法中執(zhí)行所有正常的靜態(tài)設(shè)置 — 創(chuàng)建視圖、將數(shù)據(jù)綁定到列表等等。 系統(tǒng)向此方法傳遞一個(gè) Bundle 對(duì)象,其中包含 Activity 的上一狀態(tài),不過前提是捕獲了該狀態(tài)。始終后接 onStart()。 onstart()
onRestart() 在 Activity 已停止并即將再次啟動(dòng)前調(diào)用。始終后接 onStart() onstart()
onStart() 在 Activity 即將對(duì)用戶可見之前調(diào)用。如果 Activity 轉(zhuǎn)入前臺(tái),則后接 onResume(),如果 Activity 轉(zhuǎn)入隱藏狀態(tài),則后接 onStop()。 onResume() 或onStop()
onResume 在 Activity 即將開始與用戶進(jìn)行交互之前調(diào)用。 此時(shí),Activity 處于 Activity 堆棧的頂層,并具有用戶輸入焦點(diǎn)。始終后接 onPause()。 onPause()
onPause() 當(dāng)系統(tǒng)即將開始繼續(xù)另一個(gè) Activity 時(shí)調(diào)用。 此方法通常用于確認(rèn)對(duì)持久性數(shù)據(jù)的未保存更改、停止動(dòng)畫以及其他可能消耗 CPU 的內(nèi)容,諸如此類。 它應(yīng)該非常迅速地執(zhí)行所需操作,因?yàn)樗祷睾螅乱粋€(gè) Activity 才能繼續(xù)執(zhí)行。如果 Activity 返回前臺(tái),則后接 onResume(),如果 Activity 轉(zhuǎn)入對(duì)用戶不可見狀態(tài),則后接 onStop() onResume() 或onStop()
onStop() 在 Activity 對(duì)用戶不再可見時(shí)調(diào)用。如果 Activity 被銷毀,或另一個(gè) Activity(一個(gè)現(xiàn)有 Activity 或新 Activity)繼續(xù)執(zhí)行并將其覆蓋,就可能發(fā)生這種情況。如果 Activity 恢復(fù)與用戶的交互,則后接 onRestart(),如果 Activity 被銷毀,則后接 onDestroy()。 onRestart()或onDestroy()
onDestory() 在 Activity 被銷毀前調(diào)用。這是 Activity 將收到的最后調(diào)用。 當(dāng) Activity 結(jié)束(有人對(duì) Activity 調(diào)用了 finish(),或系統(tǒng)為節(jié)省空間而暫時(shí)銷毀該 Activity 實(shí)例時(shí),可能會(huì)調(diào)用它。 您可以通過 isFinishing() 方法區(qū)分這兩種情形。

上面的文本對(duì)于Activity的生命周期的 7個(gè)方法做了一個(gè)較為詳細(xì)的講解,但是程序員還是采用比較直觀的代碼展現(xiàn):

public class FirstActivity extends Activity implements OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Activity LifeCycle","FirstActivity----->onCreate");
        setContentView(R.layout.first_layout);
        findViewById(R.id.pause).setOnClickListener(this);
        findViewById(R.id.pause_stop).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.pause:
            //跳轉(zhuǎn)到一個(gè)非全屏的activity 或者一個(gè)全透明的activity
            Intent intent = new Intent(this, TransparentActivity.class);
            startActivity(intent);
            break;
        case R.id.pause_stop:
            Intent intent2 = new Intent(this, SecondActivity.class);
            startActivity(intent2);
            break;
        }
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Activity LifeCycle","FirstActivity----->onStart");
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Activity LifeCycle","FirstActivity----->onResume");
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Activity LifeCycle","FirstActivity----->onPause");
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Activity LifeCycle","FirstActivity----->onStop");
    }
    
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("Activity LifeCycle","FirstActivity----->onRestart");
    }

     @Override
      protected void onDestroy() {
        super.onDestroy();
        Log.d("Activity LifeCycle","FirstActivity----->onDestroy");
    }
}


之后我們會(huì)使用該類來實(shí)現(xiàn)相應(yīng)的操作,驗(yàn)證流程。
首先,我們進(jìn)入該activity,


image.png

然后我們查看logcat下的日志


image.png

此時(shí)activity經(jīng)過onCreate--->onStart--->onResume,Activity獲取到焦點(diǎn),并展示在界面上。
然后我們點(diǎn)擊home鍵,這時(shí)logcat日志如下:
image.png

過程中activity經(jīng)過onPause---->onStop最終是去焦點(diǎn),并退到后臺(tái)棧中。
再次啟動(dòng)該界面,logcat展示:


image.png

在這過程中activity經(jīng)過onStart---->onResume 最終獲取焦點(diǎn),展示在界面上。
我們退出該界面,logcat展示如下:
image.png

在這過程中activity經(jīng)過onPause-->onStop--->onDestroy.結(jié)合之前的google官方圖,能夠很好的了解Activity的生命周期

學(xué)習(xí)的參考項(xiàng)目在我的github下,該項(xiàng)目是我從學(xué)習(xí)到現(xiàn)在整理的一些常用資料,歡迎大家star
https://github.com/jixiang52002/MyAndroid

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容