AudioManager.OnAudioFocusChangeListener [закрыт]

158
07 мая 2019, 06:00

Встретил такой Андроид код:

/**
 * This listener gets triggered whenever the audio focus changes
 * (i.e., we gain or lose audio focus because of another app or device).
 */
private AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ||
                focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
            // The AUDIOFOCUS_LOSS_TRANSIENT case means that we've lost audio focus for a
            // short amount of time. The AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK case means that
            // our app is allowed to continue playing sound but at a lower volume. We'll treat
            // both cases the same way because our app is playing short sound files.
            // Pause playback and reset player to the start of the file. That way, we can
            // play the word from the beginning when we resume playback.
            mMediaPlayer.pause();
            mMediaPlayer.seekTo(0);
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // The AUDIOFOCUS_GAIN case means we have regained focus and can resume playback.
            mMediaPlayer.start();
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
            // The AUDIOFOCUS_LOSS case means we've lost audio focus and
            // Stop playback and clean up resources
            releaseMediaPlayer();
        }
    }
};

прогуглил что это интерфейс, но не могу понять как он работает. Вроде же нельзя создавать объект интерфейса с помощью new, и еще почему в конце стоит точка с запятой после фигурной скобки ? ))) И еще, переопределенный метод автоматически вызывается ?? Если да, то почему, как это работает никак не пойму ?!

Answer 1

Это интерфейс переменная (Interface variable).

Простой пример:

TextView tv = (TextView) this.findViewById(R.id.hello_world);
//Interface
View.OnClickListener m_click_itf = new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                      // TODO Auto-generated method stub
              }
}; // сам по себе работать не будет
tv.setOnClickListener(m_click_itf);

Источник

На счет точки с запятой, ну вот положено так у интерфейсов, смиритесь.

Вроде же нельзя создавать объект интерфейса с помощью new

где Вы такое вычитали?

Теперь, непосредственно, перейдём к вашему коду. Это также ещё называют callback'ом. Он не работает сам по себе. На данный callback необходимо подписаться, а также обязательно отписываться в onStop, дабы избежать утечки памяти.

Если бы вы посмотрели код дальше, ну или использовали ctrl+f и в били бы туда mOnAudioFocusChangeListener, то увидели бы что на данный интерфейс подписываются таким способом, непосредственно, в onCreate:

// Request audio focus so in order to play the audio file. The app needs to play a
// short audio file, so we will request audio focus with a short amount of time
// with AUDIOFOCUS_GAIN_TRANSIENT.
int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

А также отписываются от этого, непосредственно, в onStop:

// Regardless of whether or not we were granted audio focus, abandon it. This also
// unregisters the AudioFocusChangeListener so we don't get anymore callbacks.
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);

@Override - это переопределение метода под ваши нужды.

Например:

Изначально данный метод используется для возращения на предыдущую активити или закрытие приложения, не суть.

@Override
public void onBackPressed()
{
     super.onBackPressed();
}

Вы можете изменить его под свои нужды:

@Override
public void onBackPressed()
{
     Toast.makeText(getApplicationContext(),"Hello World!",Toast.LENGTH_SHORT).show();
}

И теперь вместо выхода из активити или перехода, выведется сообщение с информацией.

READ ALSO
PriorityQueue - в классе объявлены избыточные конструкторы?

PriorityQueue - в классе объявлены избыточные конструкторы?

В классе PriorityQueue определен конструктор, который принимает аргументом CollectionВ этом конструкторе имеется проверка аргумента на соответствие...

162
Наличие аналога python exec в java

Наличие аналога python exec в java

Есть ли в Java функция, аналогичная функции exec в Python? Нигде не могу найти внятного ответа - есть или нетЕсли есть, то хорошо было бы ее назвать

126
Сохранение даты в RethinkDB

Сохранение даты в RethinkDB

В RethinkDB нужно сохранить документ, в котором содержится несколько полей с датамиПо этим датам нужно будет искать документы в RethinkDB

141
Что означает direction “1” canScrollVertically(1)? [закрыт]

Что означает direction “1” canScrollVertically(1)? [закрыт]

На что влияет параметр 1 в recyclerViewcanScrollVertically(1)

137