It does not have to be a button. It can be anything. Typically the bootloader just needs to have a decision point/criteria either to continue with the bootloader or with to execute the application (if present).
If I expect a user interaction, then a push button is my choice. But I have done this by other means e.g. writing a byte in a battery buffered external SRAM or RTC. You can do this with the internal microprocessor RAM too, you just need to make sure that the startup code does not clear that memory location. Another consideration could be to program a byte in FLASH memory by the application, then perfom a reset (e.g. through not serving the watchpoint).
I hope this gives some ideas.