I don't think a new mechanism is necessary to do the right thing.

If the user demonstrates interest on the event (or any other), you call setMessageListener() because it makes sense to listen to what native side will say. Otherwise you don't need to. Indeed you need to tell native side that you'll be caring about those events, but that's the whole point, you might not care, and native side can't really know.