最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中Activity的生命周期探討

 更新時(shí)間:2014年10月22日 09:47:54   投稿:junjie  
這篇文章主要介紹了Android中Activity的生命周期探討,本文同時(shí)講解了銷毀Activity、暫停與恢復(fù)、停止與重啟Activity等內(nèi)容,需要的朋友可以參考下

1、完整生命周期

上圖是Android Activity的生命周期圖,其中Resumed、Paused、Stopped狀態(tài)是靜態(tài)的,這三個(gè)狀態(tài)下的Activity存在時(shí)間較長(zhǎng)。

(1)Resumed:在此狀態(tài)時(shí),用戶可以與Activity進(jìn)行交互,Activity在最前端
(2)Paused:在此狀態(tài)時(shí),Activity被另外一個(gè)Activity遮蓋,此Activity不可接受用戶輸入信息。另外一個(gè)Activity來(lái)到最前面,半透明的,但并不會(huì)覆蓋整個(gè)屏幕。
(3)Stopped:在此狀態(tài)時(shí),Activity完全被隱藏,不可見(jiàn)。保留當(dāng)前信息,Activity不執(zhí)行任何代碼。
(4)Created與Started:系統(tǒng)調(diào)用onCreate()后迅速調(diào)用onStart(),然后迅速執(zhí)行onResume()。

以上就是Android的Activity整個(gè)生命周期。

2、主Activity

用戶可以指定程序啟動(dòng)的主界面,此時(shí)被聲明為“l(fā)auncher或main”Activity的onCreate()方法被調(diào)用,成為程序的入口函數(shù)。該入口Activity可以在AndroidManifest.xml中定義主Activity。此時(shí),主Activity必須使用以下標(biāo)簽聲明:

復(fù)制代碼 代碼如下:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

3、一個(gè)新的Activity實(shí)例

系統(tǒng)首先調(diào)用新Activity的onCreate()方法,所以,我們必須實(shí)現(xiàn)onCreate()方法。如:聲明UI元素、定義成員變量、配置UI等。但是事情不宜太多,避免啟動(dòng)程序太久而看不到界面。

復(fù)制代碼 代碼如下:

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml
file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

onCreate()執(zhí)行完即調(diào)用onStart()和onResume()方法,Activity不會(huì)在Created或者Started狀態(tài)停留。

4、銷毀Activity

Activity的最后一個(gè)回調(diào)是onDestroy(),系統(tǒng)會(huì)執(zhí)行這個(gè)方法做為你的Activity要從系統(tǒng)中完全刪除的信號(hào)。大多數(shù)APP不需實(shí)現(xiàn)此方法,因?yàn)榫植款惖膔eferences會(huì)隨著Activity的銷毀而銷毀。并且Activity應(yīng)該在onPause()和onStop()方法中執(zhí)行清楚Activity資源的操作。如果Activity在onCreate()時(shí)創(chuàng)建的后臺(tái)線程,或者是其他有可能導(dǎo)致內(nèi)存泄露的資源,你應(yīng)該在onDestroy()時(shí)殺死它們。

復(fù)制代碼 代碼如下:

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

系統(tǒng)通常是在執(zhí)行了onPause()與onStop()后在調(diào)用onDestroy(),除非在onCreate()中調(diào)用了finish()。例如,如果你的Activity只是做了一個(gè)臨時(shí)的邏輯跳轉(zhuǎn)功能,它使用用來(lái)決定跳轉(zhuǎn)到下一個(gè)Activity,這樣,你需要在onCreate()中調(diào)用finish()方法。系統(tǒng)就會(huì)直接調(diào)用onDestroy方法,其他生命周期就不會(huì)被執(zhí)行。

5、暫停與恢復(fù)

當(dāng)前Activity被其它可見(jiàn)組件阻塞,當(dāng)前Activity部分可見(jiàn),當(dāng)前Activity進(jìn)入Pause狀態(tài)。系統(tǒng)調(diào)用Activity中的onPause()方法,執(zhí)行onResume()方法恢復(fù)。

當(dāng)前Activity被其它組件完全阻塞,當(dāng)前Activity完全不可見(jiàn),則當(dāng)前Activity進(jìn)入Stop狀態(tài)。

當(dāng)系統(tǒng)調(diào)用你的Activity中的onPause(),從技術(shù)上講,那意味著你的Activity仍然處于部分可見(jiàn)的狀態(tài)。通常在onPause()回調(diào)方法里面做下面的事情。

(1)停止動(dòng)畫(huà)或者其他正在運(yùn)行的操作,減少CPU浪費(fèi)
(2)提交沒(méi)有保存的改變,但僅僅是用戶離開(kāi)時(shí)保存的內(nèi)容,如郵件
(3)釋放系統(tǒng)資源,如broadcast receivers、sensors、GPS或者其他任何影響電量的資源。
(4)如果程序正在使用Camera,onPause()會(huì)是一個(gè)比較好的地方去釋放資源的操作。

復(fù)制代碼 代碼如下:

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

通常,不應(yīng)該使用onPause()來(lái)保存用戶改變的數(shù)據(jù)到永久存儲(chǔ)上,當(dāng)你確認(rèn)用戶期待那些改變能夠自動(dòng)保存的時(shí)候,才可以把那些數(shù)據(jù)存儲(chǔ)到永久存儲(chǔ)。然而,應(yīng)該避免在onPause()時(shí)執(zhí)行CPU-intensive的工作,例如寫數(shù)據(jù)到DB,因?yàn)樗麜?huì)導(dǎo)致切換Activity變得緩慢。這些工作應(yīng)該放到onStop()中去坐。

如果,Activity實(shí)際上要被Stop,那么應(yīng)減少在onPause中的工作量,提高流暢性。

恢復(fù)Activity

用戶從Pause狀態(tài)恢復(fù)時(shí),調(diào)用onResume()方法。此時(shí)Activity處于最前臺(tái),包括第一次創(chuàng)建時(shí),此時(shí),應(yīng)該在onResume中初始化那些你在onPause方法里釋放掉的組件,并執(zhí)行那些Activity每次進(jìn)入Resumed state都需要的初始化動(dòng)作。

復(fù)制代碼 代碼如下:

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

6、停止與重啟Activity

恰當(dāng)?shù)耐V古c重啟Activity會(huì)使用戶感知程序的進(jìn)行。下面一些場(chǎng)景涉及停止與重啟:

(1)用戶打開(kāi)最近使用的App的菜單并切換到另外一個(gè)App,此時(shí),你的App是被停止的,用戶回到你的App,那么你的Activity被重啟。
(2)用戶在App中啟動(dòng)一個(gè)新的Activity的操作,當(dāng)前Activity會(huì)在新Activity創(chuàng)建后stop,如果用戶點(diǎn)擊back按鈕,回到上一個(gè)Activity,重啟
(3)用戶使用App,接到來(lái)電時(shí)。

停止?fàn)顟B(tài)UI不可見(jiàn)。系統(tǒng)在Activity停止時(shí)會(huì)在內(nèi)存中保存了Activity實(shí)例,有時(shí)不需事先onStop(),onRestart()甚至onStart()方法,因?yàn)榇蠖鄶?shù)的activity相對(duì)簡(jiǎn)單,activity會(huì)自己停止與重啟。你只需要使用onPause來(lái)停止正在運(yùn)行的動(dòng)作,并斷開(kāi)系統(tǒng)資源鏈接。

上圖顯示:當(dāng)用戶離開(kāi)你的Activity,系統(tǒng)會(huì)調(diào)用onStop()來(lái)停止Activity,用戶返回時(shí)調(diào)用onRestart(),然后迅速調(diào)用onStart()與onResume(),無(wú)論什么原因?qū)е翧ctivity停止,系統(tǒng)總會(huì)在onStop之前調(diào)用onPause

停止Activity

當(dāng)你的Activity調(diào)用onStop方法,Activity不再可見(jiàn),并且應(yīng)該釋放那些不再需要的所有資源,一旦你的Activity停止了,系統(tǒng)會(huì)在不需要的這個(gè)activity時(shí)銷毀它的實(shí)例。在極端情況下,系統(tǒng)會(huì)直接殺死你的App進(jìn)程,并且不執(zhí)行Activity的onDestroy()回調(diào)函數(shù),因此你需要在onStop()來(lái)釋放資源,否則內(nèi)存泄露。盡管onPause方法在onStop之前調(diào)用,應(yīng)應(yīng)該使用onStop來(lái)執(zhí)行CPU-intensive的shut-down操作。如寫數(shù)據(jù)到DB。

當(dāng)Activity停止,其對(duì)象會(huì)保存在內(nèi)存中,并且在Resume時(shí)重新調(diào)用,不需在恢復(fù)到Resumed state狀態(tài)前初始化那些被保存在內(nèi)存中得組件,系統(tǒng)為我們保存了每一個(gè)在布局中的視圖的當(dāng)前狀態(tài)。即使系統(tǒng)會(huì)在Activity stop時(shí)銷毀這個(gè)Activity,它仍然會(huì)保存View對(duì)象的狀態(tài)到一個(gè)Bundle中,并且在用戶返回這個(gè)Activity時(shí)恢復(fù)他們。

重新創(chuàng)建Activity:當(dāng)Activity在屏幕被旋轉(zhuǎn)時(shí),會(huì)被destroy與recreated。此時(shí)會(huì)加載一些alternative的資源,如layout。默認(rèn)情況下,系統(tǒng)使用Bundle實(shí)例來(lái)保存每一個(gè)視圖對(duì)象中得信息。為了使Android系統(tǒng)能夠恢復(fù)Activity中的View狀態(tài),每個(gè)View都必須有一個(gè)唯一的ID

為了確保額外更多的數(shù)據(jù)到saved instance state,在Activity的聲明周期里面存在一個(gè)添加的回調(diào)函數(shù),必須重寫onSaveInstanceState(),當(dāng)用戶離開(kāi)你的Activity時(shí),系統(tǒng)會(huì)調(diào)用它。當(dāng)系統(tǒng)調(diào)用這個(gè)函數(shù)時(shí),系統(tǒng)會(huì)在你的Activity被一場(chǎng)Destroy時(shí)傳遞Bundle對(duì)象,這樣,你可以增加額外的信息到Bundle中,并保存在系統(tǒng)中。如果系統(tǒng)在Activity被Destroy之后想重新創(chuàng)建這個(gè)Activity實(shí)例時(shí),之前的那個(gè)Bundle對(duì)象會(huì)被傳遞到Activity的onRestoreInstanceState()方法和onCreate()方法中。

保存Activity狀態(tài):當(dāng)Activity開(kāi)始Stop時(shí),系統(tǒng)會(huì)調(diào)用onSaveInstanceState(),因此你的Activity可以用鍵值對(duì)的集合來(lái)保存狀態(tài)信息,這個(gè)方法會(huì)默認(rèn)保存Activity視圖的狀態(tài)信息,例如在EditText組件中得文本或者是ListView的滑動(dòng)位置。為了給Activity保存額外的狀態(tài)信息,你必須實(shí)現(xiàn)onSaveInstanceState()并增加鍵值對(duì)到Bundle中。如:

復(fù)制代碼 代碼如下:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

恢復(fù)Activity狀態(tài):當(dāng)你的Activity從Destroy中重建,你可以從系統(tǒng)傳遞給你的Activity的Bundle中恢復(fù)保存的狀態(tài)。onCreate()與onRestoreInstanceState()回調(diào)方法都接收到了同樣的Bundle,里面包含同樣的實(shí)例狀態(tài)信息。因?yàn)閛nCreate()方法會(huì)在第一次創(chuàng)建新的Activity實(shí)例與重新創(chuàng)建之前被Destroy的實(shí)例時(shí)都被調(diào)用,你必須嘗試讀取Bundle對(duì)象之前檢查它是否為NULL,如果為NULL,系統(tǒng)第一次創(chuàng)建新Activity。否則是恢復(fù)被Destroy的Activity。

復(fù)制代碼 代碼如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我們可以選擇實(shí)現(xiàn)onRestoreInstanceState(),而不是在onCreate方法里恢復(fù)數(shù)據(jù)。onRestoreInstanceState()方法會(huì)在onStart()方法之后執(zhí)行,系統(tǒng)僅僅會(huì)在存在需要恢復(fù)的狀態(tài)信息時(shí)才會(huì)調(diào)用onRestoreInstanceState(),因此不需檢查Bundle是否為NULL。

復(fù)制代碼 代碼如下:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

相關(guān)文章

  • Android開(kāi)發(fā)之Parcel機(jī)制實(shí)例分析

    Android開(kāi)發(fā)之Parcel機(jī)制實(shí)例分析

    這篇文章主要介紹了Android開(kāi)發(fā)之Parcel機(jī)制,實(shí)例分析了Parcel機(jī)制的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Android中使用ViewStub實(shí)現(xiàn)布局優(yōu)化

    Android中使用ViewStub實(shí)現(xiàn)布局優(yōu)化

    ViewStub是Android布局優(yōu)化中一個(gè)很不錯(cuò)的標(biāo)簽/控件,直接繼承自View。雖然Android開(kāi)發(fā)人員基本上都聽(tīng)說(shuō)過(guò),但是真正用的可能不多。今天我們就來(lái)詳細(xì)探討下ViewStub的使用
    2016-09-09
  • Android AIDL和遠(yuǎn)程Service調(diào)用示例代碼

    Android AIDL和遠(yuǎn)程Service調(diào)用示例代碼

    本文主要介紹Android AIDL和遠(yuǎn)程Service,這里詳細(xì)介紹了相關(guān)知識(shí),并附實(shí)例代碼和實(shí)現(xiàn)效果圖,有興趣的朋友參考下
    2016-08-08
  • Android登錄注冊(cè)功能 數(shù)據(jù)庫(kù)SQLite驗(yàn)證

    Android登錄注冊(cè)功能 數(shù)據(jù)庫(kù)SQLite驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了Android登錄注冊(cè)功能,數(shù)據(jù)庫(kù)SQLite驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • android點(diǎn)擊無(wú)效驗(yàn)證的解決方法

    android點(diǎn)擊無(wú)效驗(yàn)證的解決方法

    這篇文章主要給大家介紹了關(guān)于android點(diǎn)擊無(wú)效驗(yàn)證的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Android 環(huán)境變量的配置方法

    Android 環(huán)境變量的配置方法

    本文主要介紹Android 環(huán)境變量的配置方法,這里詳細(xì)講解了如何實(shí)現(xiàn)環(huán)境變量的配置方法,有興趣的小伙伴可以參考下
    2016-09-09
  • Flutter使用RepositoryProvider解決跨組件傳值問(wèn)題

    Flutter使用RepositoryProvider解決跨組件傳值問(wèn)題

    在實(shí)際開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到父子組件傳值的情況。本文將利用RepositoryProvider解決跨組件傳值的問(wèn)題,感興趣的小伙伴可以了解一下
    2022-04-04
  • Android控件Tween動(dòng)畫(huà)(補(bǔ)間動(dòng)畫(huà))實(shí)現(xiàn)方法示例

    Android控件Tween動(dòng)畫(huà)(補(bǔ)間動(dòng)畫(huà))實(shí)現(xiàn)方法示例

    這篇文章主要介紹了Android控件Tween動(dòng)畫(huà)(補(bǔ)間動(dòng)畫(huà))實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了Android補(bǔ)間動(dòng)畫(huà)的原理、功能實(shí)現(xiàn)與布局相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android?Framework層獲取及處理按鍵事件流程

    Android?Framework層獲取及處理按鍵事件流程

    本文主要介紹了Android?Framework層獲取及處理按鍵事件流程,Android系統(tǒng)的輸入事件是InputManagerService服務(wù)來(lái)監(jiān)控的,該系統(tǒng)服務(wù)在SystemServer的startOtherServices()中初始化,更多介紹需要的小伙伴可以參考一下
    2022-08-08
  • Delphi在Android下使用Java庫(kù)的方法

    Delphi在Android下使用Java庫(kù)的方法

    這篇文章主要介紹了Delphi在Android下使用Java庫(kù)的方法,本文以Android的USB串口通訊庫(kù)為例,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11

最新評(píng)論

上蔡县| 杭州市| 盘山县| 息烽县| 乐都县| 富川| 香港 | 海兴县| 洛隆县| 房产| 乌拉特中旗| 萨迦县| 石柱| 翁源县| 大邑县| 海宁市| 石台县| 巍山| 青州市| 赤峰市| 象州县| 太仓市| 阆中市| 太谷县| 建宁县| 涿鹿县| 桐城市| 重庆市| 长岭县| 民权县| 广安市| 玉屏| 安达市| 普安县| 海原县| 镶黄旗| 锦州市| 鄱阳县| 巧家县| 甘德县| 屏边|