With Android model of memory management, there is no guarantee that any destructor will be called. The only guarantee you have by the book is that the onPause()
method will be called for the foreground activity.
OTOH, the Linux kernel takes care of releasing all resources that had been used by a process that shuts down either gracefully or by force.
Therefore unless your Singleton locks some very special system resource which cannot be reclaimed automatically by the kernel, you should not worry about it's destructor. But if it does (e.g. of it locks the Camera), you need a bulletproof mechanism to unlock this resource as early as possible, preferably in onPause()
.
All this discussion does not apply to creation of a Singleton. You may use any of the methods you described above, and chose the one that fits best with your architecture. Only keep in mind the race situations when the app destruction sequence may start while the Manager object is still being created (only likely in a multithreaded scenario).