У меня есть приложение для 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()) оно изменяет громкость на максимальный, но не восстанавливает его до предыдущего объема в onPause(). Однако, если приложение запускается с помощью onResume() (означает, что приложение работало в фоновом режиме), оно изменит громкость на максимум и восстановит ее до предыдущей громкости в onPause().

Код вроде в порядке, но я несколько дней не понимал, в чем проблема, пожалуйста, помогите, спасибо!

0
Andrew 8 Сен 2016 в 06:50

3 ответа

Лучший ответ

В соответствии с жизненным циклом Android Activity, вы вызываете метод changeRingtone() дважды, вы должны вызывать этот метод только в своем методе onResume.

Activity life cycle

2
rockar06 8 Сен 2016 в 04:07

Цитата эту статью из официального обучения Android:

По умолчанию система использует состояние экземпляра Bundle для сохранения информации о каждом объекте View в макете действия (например, текстовое значение, введенное в объект EditText). Итак, если ваш экземпляр активности уничтожен и воссоздан, состояние макета будет восстановлено до предыдущего состояния без кода, необходимого вам. Однако в вашей деятельности может быть больше информации о состоянии, которую вы хотели бы восстановить, например, переменные-члены, которые отслеживают прогресс пользователя в действии.

Для получения дополнительных объяснений ознакомьтесь также с этим сообщением на StackOverFlow.

0
Community 23 Май 2017 в 12:32

On Pause будет звонить, когда после запуска вашей активности и между ними приходит телефонный звонок.

0
Parvesh Khan 8 Сен 2016 в 05:59