Yeah, that's pretty much what I was talking about, but if the cannon is a static sprite, it won't solve the problem: the cannonball will still show on top.
If I remember correctly, in the Taekwon-do remake game, I added a property to sprite definitions called isDynamic. When sprites are added at runtime, the property is set to true. Then, when deactivation occurs, dynamic sprites are completely removed and static sprites are just deactivated. I think I also did a function to rearrange sprites in the list. This way, you can mix static and dynamic sprites together in the list. You do have to change some other stuff too to make it work well I think. It's been a while and I suppose forgot some things.