Android編程權(quán)威指南(第三版)第三章學(xué)習(xí)筆記

無(wú)關(guān)技術(shù)

努力既是指為了自己的目標(biāo)不斷奮斗,也是指不斷地充實(shí)豐富自己,使明天的自己比昨天的自己優(yōu)秀一點(diǎn).

知識(shí)概要

本章主要講解了Activity的生命周期和logcat的基本使用.在android開(kāi)發(fā)中g(shù)ithub有一個(gè)很棒的開(kāi)源工具類AndroidUtilCode.

生命周期執(zhí)行的方法

啟動(dòng)Activity

onCreate-->onStart-->onResume

按返回鍵

onPause-->onStop-->onDestroy

再回來(lái)

onCreate-->onStart-->onResume

按home鍵

onPause-->onStop

再回來(lái)

onStart--onResume

屏幕旋轉(zhuǎn)

onPause-->onStop-->onDestroy
--onCreate-->onStart-->onResume

其實(shí)就是銷毀當(dāng)前Activity然后重新創(chuàng)建.

為什么屏幕旋轉(zhuǎn)會(huì)重新創(chuàng)建Activity?

設(shè)備配置是一系列的特征組合,用來(lái)描述設(shè)備的當(dāng)前狀態(tài).
這些狀態(tài)包括:屏幕方向,屏幕像素密度,屏幕尺寸,鍵盤類型,底座模式以及語(yǔ)言等.
當(dāng)屏幕旋轉(zhuǎn)時(shí),會(huì)改變?cè)O(shè)備配置,可能會(huì)有更好的資源來(lái)匹配設(shè)置,所以為新配置尋找最佳的資源,android會(huì)銷毀當(dāng)前的Activity,然后重建.

設(shè)備旋轉(zhuǎn)時(shí),數(shù)據(jù)的保存與恢復(fù)?

重寫(xiě)onSaveInstanceState,將需要保存的數(shù)據(jù)保存在Bundle中,然后在onCreate方法中,將其取出.
如:
`

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(KEY_INDEX,mCurrentIndex);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate: ");
    setContentView(R.layout.activity_quiz);

    if (savedInstanceState != null) {
        mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
    }

`

注意Bundle中只能保存基本數(shù)據(jù)類型和實(shí)現(xiàn)了序列化接口的對(duì)象.

暫存的Activity記錄能保留多久?

在onSaveInstanceState方法中的數(shù)據(jù),會(huì)被保存在Bundle中,操作系統(tǒng)會(huì)將Bundle對(duì)象放入Activity記錄中,Activity暫存后,Activity對(duì)象不再存在,但操作系統(tǒng)會(huì)將Activity記錄保存下來(lái),在需要恢復(fù)Activity時(shí),暫存的Activity會(huì)重新激活A(yù)ctivity.另外,用戶按了返回鍵后,系統(tǒng)會(huì)徹底銷毀當(dāng)前的Activity,暫存的記錄同時(shí)被清除.系統(tǒng)重新的話,暫存的Activity記錄也會(huì)被清除.
onSaveInstanceState方法在onStop之前由系統(tǒng)調(diào)用.

Activity內(nèi)存清理現(xiàn)狀

在低內(nèi)存狀態(tài),android直接從內(nèi)存中清除整個(gè)應(yīng)用,連帶應(yīng)用所有的Activity,android還做不到只銷毀單個(gè)Activity.有前臺(tái)或者可見(jiàn)Activity的進(jìn)程優(yōu)先級(jí)更高,操作系統(tǒng)不會(huì)殺死可見(jiàn)進(jìn)程.重啟或者死機(jī)除外.
低內(nèi)存的測(cè)試,打開(kāi)開(kāi)發(fā)者選項(xiàng),勾選don't keep activities.
然后按home鍵后,執(zhí)行的生命周期是
onPause-->onStop-->onDestroy
重新進(jìn)來(lái)后,onSaveInstanceState中的數(shù)據(jù)是恢復(fù)了的.

挑戰(zhàn)練習(xí)

禁止一題多答

思路:保存一個(gè)與題目大小相等的boolean數(shù)組,默認(rèn)值全部設(shè)為true,也就是按鈕默認(rèn)可以點(diǎn)擊,當(dāng)用戶答題之后,就將當(dāng)前索引的boolean值設(shè)置為false.由于trueButton和falseButton都會(huì)執(zhí)行checkAnswer方法,所以只需要在此方法中加入
`

    private void checkAnswer(boolean userPressedTrue) {
    boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
    int messageResId = 0;
    if (userPressedTrue == answerIsTrue) {
        messageResId = R.string.correct_toast;
        mCorrectCount++;
    } else {
        messageResId = R.string.incorrect_toast;
    }

    Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show();
**mBtnEnables[mCurrentIndex] = false;**

**setBtnEnable();**

   ...
}

  private void setBtnEnable() {
    mTrueButton.setEnabled(mBtnEnables[mCurrentIndex]);
    mFalseButton.setEnabled(mBtnEnables[mCurrentIndex]);
}

`
防止屏幕旋轉(zhuǎn),狀態(tài)丟失,應(yīng)該在Bundle中保存這個(gè)boolean數(shù)組

統(tǒng)計(jì)答對(duì)題數(shù)的分?jǐn)?shù)

聲明一個(gè)int值用來(lái)保存用戶答對(duì)的題數(shù),當(dāng)答對(duì)時(shí),將這個(gè)值加1.
然后在判斷當(dāng)前索引==題目數(shù)時(shí),彈toast,分?jǐn)?shù) = 答對(duì)題數(shù) * 100 /總題數(shù)
`

    private void checkAnswer(boolean userPressedTrue) {
    boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
    int messageResId = 0;
    if (userPressedTrue == answerIsTrue) {
        messageResId = R.string.correct_toast;
       ** mCorrectCount++;**
    } else {
        messageResId = R.string.incorrect_toast;
    }

    Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show();
    mBtnEnables[mCurrentIndex] = false;
    setBtnEnable();
   ** if (mCurrentIndex == mQuestionBank.length - 1) {

        Toast.makeText(this, getString(R.string.score) + (mCorrectCount * 100 / mQuestionBank.length) + "%", Toast
                .LENGTH_SHORT)
                .show();
    }**
}

`

這兩題用到的變量都要保存在Bundle中,因?yàn)槠聊恍D(zhuǎn)時(shí),都會(huì)被初始化.所以要
`

   @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(KEY_INDEX, mCurrentIndex);
    outState.putBooleanArray(KEY_BTN_ENABLE, mBtnEnables);
    outState.putInt(KEY_CORRECT_COUNT, mCorrectCount);
}

然后在onCreate方法中取出來(lái).

   if (savedInstanceState != null) {
        mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
        mBtnEnables = savedInstanceState.getBooleanArray(KEY_BTN_ENABLE);
        mCorrectCount = savedInstanceState.getInt(KEY_CORRECT_COUNT, 0);
    }

`

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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