簡體   English   中英

Android,onCreate()無法使用某些功能,但onResume()可以使用

[英]Android, something won't work in onCreate(), but it will in onResume()

我有一個Android應用程序,可將鈴聲音量更改為最大,並在退出或按下主屏幕按鈕時恢復鈴聲音量。 這是代碼片段。

int ringMode;
int ringVolume;

protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    changeRingtone();
}

@Override
protected void onResume() {
    changeRingtone();
}

private void changeRingtone() {
    ringVolume = audioManager.getStreamVolume(audioManager.STREAM_RING);
    ringMode = audioManager.getRingerMode();
    audioManager.setStreamVolume(audioManager.STREAM_RING,
         audioManager.getStreamMaxVolume(audioManager.STREAM_RING),
         AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}

@Override
protected void onPause() {
        audioManager.setStreamVolume(audioManager.STREAM_RING, ringVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
        audioManager.setRingerMode(ringMode);
        super.onPause();
}

現在的問題是,當應用程序首次啟動(調用onCreate() )時,它會將卷更改為max,但沒有將其還原到onPause()先前卷。 但是,如果應用程序由onResume()啟動(意味着該應用程序處於后台),它將把音量更改為max,並確實將其還原到onPause()先前音量。

該代碼似乎很好,但幾天來我一直沒有弄清楚問題出在哪里,請幫忙,謝謝!

根據Android Activity生命周期,您將兩次調用changeRingtone()方法,因此僅應在onResume方法中調用此方法。

活動生命周期

引用來自官方Android培訓的這篇文章:

默認情況下,系統使用Bundle實例狀態來保存有關活動布局中每個View對象的信息(例如,輸入到EditText對象中的文本值)。 因此,如果您的活動實例被銷毀並重新創建,則布局狀態將恢復為之前的狀態,而無需您執行任何代碼。 但是,您的活動可能具有更多要還原的狀態信息,例如跟蹤用戶在活動中進度的成員變量。

有關更多說明,請另請參閱 StackOverFlow帖子。

在您的活動啟動之后以及打入電話之間會在暫停時呼叫on。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM