Well, basically I'll give you the idea of how this works and you implement ok.
You must have a server where there is a file that tells you which version is currently published.
Example:
In the root folder of your server (server is the software ok), you have a VersionPublish folder, inside it you can have an XML file, for example, containing the current version name, code number, publication date , etc.
And also, within this root folder, the last APK file that matches the description in XML.
So you have your application query the server.
Example:
Your application sends a request to the server informing the version (code number) of the currently installed application. The server verifies the currently published version is higher than the one reported by the requesting application.
If yes, it returns a true response (there you show the refresh button, or a message to the user asking if he wants to update, etc.).
When the user informs that they want to update, you send another request to the server requesting the download of the published file.
After downloading, the user installs the APK normally.
Consider that you can not do the same type of update performed by the Play Store.
If you are afraid of getting your APK on your mobile phone, simply download it to an internal folder and then call the OS installation itself.
This was a simple example! Consider all the engineering behind security, etc.