Встретил такой Андроид код:
/**
* 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, и еще почему в конце стоит точка с запятой после фигурной скобки ? ))) И еще, переопределенный метод автоматически вызывается ?? Если да, то почему, как это работает никак не пойму ?!
Это интерфейс переменная (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();
}
И теперь вместо выхода из активити или перехода, выведется сообщение с информацией.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В классе PriorityQueue определен конструктор, который принимает аргументом CollectionВ этом конструкторе имеется проверка аргумента на соответствие...
Есть ли в Java функция, аналогичная функции exec в Python? Нигде не могу найти внятного ответа - есть или нетЕсли есть, то хорошо было бы ее назвать
В RethinkDB нужно сохранить документ, в котором содержится несколько полей с датамиПо этим датам нужно будет искать документы в RethinkDB
На что влияет параметр 1 в recyclerViewcanScrollVertically(1)