Have you seen this page, they are wiring up application events within an addin.
In the past I've set the onDemand property to False for a button which forces the addin button to load and you can run code in the onstartup() but this does not deal with shutdown.
I think using application events is wrong way. I need exactly points in time where add-in initialized and uninitialized. I can use extension for that purpose. But it's complexity without any benefits for user (user should remember that turning extension on in Extension dialog is required to use add-in).