Как узнать, завершил ли пользователь, наконец, все ваши действия в приложении для Android - PullRequest
2 голосов
/ 01 февраля 2012

Я хочу установить для ringvolume значение 0, когда пользователь открывает мое обучающее приложение, а затем возвращает его к исходному объему, когда пользователь выходит.Какой лучший способ сделать это?Я могу установить громкость на 0 без проблемТрудность состоит в том, чтобы знать, когда его восстанавливать, в моем приложении есть несколько действий, которые часто используются, и я беспокоюсь о влиянии на производительность установки громкости на 0 для каждого onCreate() и восстановления его на каждом onStop().кажется грязным и трудоемким!У кого-нибудь есть предложения?

В качестве дополнения,

Я подумал, как сделать половину этого:создать логическое значение leaving =true;когда пользователь открывает новое намерение для моего следующего действия, установите это trueв onPause() используйте эту переменную, чтобы проверить, «покидает» ли пользователь или просто открывает другое из «моих действий»Это по-прежнему означает, что я должен включить звонок во всех моих onResume() сУ кого-нибудь есть дальнейшие решения?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Проблема в том, что ваше приложение не всегда может быть на вершине стека активности, когда оно запущено.Что, если пользователь переключается на другое приложение, или какой-то сигнал тревоги или телефонный звонок переходит в фокус?

Вот несколько способов, которыми я хотел бы добиться того, что вы пытаетесь сделать (расширено из комментариев ниже):

Вариант 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 () , вместо этого можно использовать рабочий поток и уведомление в строке состояния :

  1. В каждом занятии onResume () ;запустив AsyncTask (или задачу Runnable), вы можете создать подкласс Activity для совместного использования этого кода с другими вашими действиями.
  2. Этот рабочий поток сначала проверяет , а затем отключает звук тома.Если громкость изменяется, он отображает значок уведомления, который информирует пользователя о том, что громкость была отключена.
  3. Рабочий поток может затем завершиться, выполнив эту проверку и действие, не влияя на производительность пользовательского интерфейса.
  4. Громкость звука будет оставаться отключенной на время работы приложения, если пользователь переходит к другому приложению (или входящий вызов / сообщение получает фокус), он / она все еще знает, что громкость отключена, поскольку значок уведомления все еще присутствует.
  5. Если пользователь нажимает значок уведомления, намерение широковещания восстанавливает объем,Это также может быть вызвано кнопкой или действием в вашем приложении.

Если пользователь нажимает кнопку «Домой» или нажимает кнопку «Назад» в вашем приложении, громкость восстанавливаться не будет.Это сделано намеренно, поскольку они не «вышли» из вашего приложения, они просто переместились в конец стека активности.Правило будет таким: пока значок уведомления виден, громкость звука отключена вашим приложением.

Дополнительное преимущество заключается в том, что если другое приложение изменяет громкость, ваше приложение всегда будет проверять, когда любая вашей деятельности снова получает фокус.

0 голосов
/ 10 июня 2013

используйте функцию

@Override
public void onResme() {
super.onResme();
//mute volume here
}

Это поможет вам сделать то, что вы хотите

0 голосов
/ 01 февраля 2012

используйте функцию

@Override
public void onDestry() {
  super.onDestroy();
  // re-enable sound here
}

в вашем основном действии, чтобы вы могли реагировать как на «выход», так и на «уничтожение менеджером задач».

...