What L. Spiro said is the right way to do it. For a simplistic approach, the way I would go about it is, every frame, you'll want to have gravity act on all movable objects, meaning, the y-velocity of all objects gets the gravity velocity added to it. If the gravity moves an object onto (or into) another object, reset the objects y-location (or place it directly above the object it hit).
When a player jumps, you can check if gravity has already found out the player is on the ground/on an object (by it having tried to move it down, and it failed because the player was already on an object), and, if so, allow jump (basically, just set the player's y-velocity to your initial jumping velocity).
If jumping (or just falling off a platform), since gravity is always moving your objects down, there is no special checks for IsJumping, IsOnGround, etc., your objects will always have it's y-velocity decreased, and eventually go negative, back towards the earth automatically, until it hits something in the y direction.
Be careful about your collisions as well. You don't want your player to stop moving in the y-direction if he hits a wall in the x-direction. Typically, you want to move a player in one direction, check for collisions, handle collisions, and then move and check in the other axis. This way, if you're jumping and moving right and you hit a wall, you'll move in the x-direction, see you've hit a wall, reset your x-position, then move in the y-direction, no collision, and update the y-position.