Событие висит на кнопке. Кнопка принадлежит активити. Интерфейс это конкракт. Активити его реализует. Нажатие срабатывает то в любом месте активити, но выполнится логика имена, та, что прописана для конкретного элемента, на который нажал. Если ничего не прописано. То и ничего не произойдёт. И твой пример с реализацией интерфейса активити - это один из вариантов, но не обязательный. Ты вполне можешь вызывать на той же кнопке setOnClicistener и передавать туда объект анонимного внутреннего класса. Есть либы, которые позволяют сетить листенеры, помечая метод анотацией. Подходов к навешиванию листенеров очень много )