Как обычно такие вещи можно почитать в документации:
О ресурсах:
https://developer.android.com/guide/topics/resourc...
О доступе к ресурсам:
https://developer.android.com/guide/topics/resourc...
Класс R генерируется тулзой aapt (Android Asset Packaging Tool). R содержит идентификаторы для соответствующих ресурсов, которые можно затем использовать в своём коде (например, findViewById). Связывается MainActivity и activity_main.xml через вызов setContentView(R.layout.activity_main). setContentView имеет две перегрузки, одна для вызова с объектом View - задать конкретный объект для представления UI данного Activity, а другая для вызова с int - задаёт идентификатор layout ресурса, который затем надувается (inflate). inflate это, как несложно себе вообразить, процесс создания иерархии View по данным из ресурсного файла с layout, занимаются этим процессом потомки абстрактного класса LayoutInflater, собственно он и умеет привязывать обработчики и все остальное.
Также можете поискать в своём проекте сгенерированный файл R.java и просмотреть его.