Проблема в том, что ваше приложение не всегда может быть на вершине стека активности, когда оно запущено.Что, если пользователь переключается на другое приложение, или какой-то сигнал тревоги или телефонный звонок переходит в фокус?
Вот несколько способов, которыми я хотел бы добиться того, что вы пытаетесь сделать (расширено из комментариев ниже):
Вариант 1:
Если действие отключения звука не влияет на производительность вашего приложения (из моего собственного опыта я подозреваю, что это не так), вы можете упростить решение, которое вы предложили в своем вопросе, с помощьюединый абстрактный базовый класс, перегружающий onResume () и onPause () , чтобы обеспечить захват события, когда пользователь возвращается к уже созданному действию:
public abstract class TeachingAppActivity extends Activity {
public void onResume() {
super.onResume();
// Perform mute action here...
}
public void onPause() {
super.onPause();
// Perform unmute action here...
}
}
public class MyActivity1 extends TeachingAppActivity {
}
public class MyActivity2 extends TeachingAppActivity {
}
Это упростит ваш код, но сохранит действие, содержащееся в ваших действиях: если другое приложение захватывает фокус, звонок будет восстановлен.Если пользователь вернется к MyActivity2, звонок снова будет отключен.
Вариант 2:
Если действие отключения звука действительно повлияет на производительность вашего приложения, или вы просто этого не сделаетехотите выполнить его в каждом действии onResume () и onPause () , вместо этого можно использовать рабочий поток и уведомление в строке состояния :
- В каждом занятии onResume () ;запустив AsyncTask (или задачу Runnable), вы можете создать подкласс Activity для совместного использования этого кода с другими вашими действиями.
- Этот рабочий поток сначала проверяет , а затем отключает звук тома.Если громкость изменяется, он отображает значок уведомления, который информирует пользователя о том, что громкость была отключена.
- Рабочий поток может затем завершиться, выполнив эту проверку и действие, не влияя на производительность пользовательского интерфейса.
- Громкость звука будет оставаться отключенной на время работы приложения, если пользователь переходит к другому приложению (или входящий вызов / сообщение получает фокус), он / она все еще знает, что громкость отключена, поскольку значок уведомления все еще присутствует.
- Если пользователь нажимает значок уведомления, намерение широковещания восстанавливает объем,Это также может быть вызвано кнопкой или действием в вашем приложении.
Если пользователь нажимает кнопку «Домой» или нажимает кнопку «Назад» в вашем приложении, громкость восстанавливаться не будет.Это сделано намеренно, поскольку они не «вышли» из вашего приложения, они просто переместились в конец стека активности.Правило будет таким: пока значок уведомления виден, громкость звука отключена вашим приложением.
Дополнительное преимущество заключается в том, что если другое приложение изменяет громкость, ваше приложение всегда будет проверять, когда любая вашей деятельности снова получает фокус.