Never pass an Activity reference to anything that could live longer than the Activity. Ever. Don't leak Activity references.
There is no "best way" to communicate between an Activity and a Service, but there are lots of options and you can choose the one that's best for your use case.
An Activity typically communicates with a "started Service" by sending it an Intent with startService. This is usually preferred over a "bound Service" because it's less code and more straightforward. Starting a service this way basically packages up some data for the Service to deal with on its own. You can think of startService as saying, "Hey, service, do this work for me". And since an Intent can't contain "leakable" object references, it's safe in that respect.
For a Service to communicate back to an Activity:
LocalBroadcastManager
This works like the regular Android broadcast mechanism, except the broadcasts never leave your application (so they can't be intercepted by other apps).
Event Bus
Google doesn't provide an official event bus, but there lots out there to choose from if you simply search for "Android event bus". These provide features that make them easier to use than LocalBroadcastManager and also allow some sense of state for various data broadcasts that you define. Which one you choose may depend on the features provided or the style of expression you prefer.
Bound Service
This is similar to Messenger, but sets up a formal "link" between the client and the Service. You can use it to perform RPC style calls between the same or different processes (with a Messenger). Bear in mind that each time an activity comes and goes (like an orientation change) it has to unbind and rebind to the service. This interruption may not be good for your activity logic.
There might be other options, but these are the ones used most often that I know of.