================ UPDATE 24 Jan 2015 ====================
For understanding the difference between Messenger and AIDL mechanism, as per documentation
Using a Messenger
If you need your interface to work across different processes, you can create an interface for the service with a Messenger. In this manner, the service defines a Handler that responds to different types of Message objects. This Handler is the basis for a Messenger that can then share an IBinder with the client, allowing the client to send commands to the service using Message objects. Additionally, the client can define a Messenger of its own so the service can send messages back.
This is the simplest way to perform interprocess communication (IPC), because the Messenger queues all requests into a single thread so that you don't have to design your service to be thread-safe.
Using AIDL
AIDL (Android Interface Definition Language) performs all the work to decompose objects into primitives that the operating system can understand and marshall them across processes to perform IPC. The previous technique, using a Messenger, is actually based on AIDL as its underlying structure. As mentioned above, the Messenger creates a queue of all the client requests in a single thread, so the service receives requests one at a time. If, however, you want your service to handle multiple requests simultaneously, then you can use AIDL directly. In this case, your service must be capable of multi-threading and be built thread-safe.
To use AIDL directly, you must create an .aidl file that defines the programming interface. The Android SDK tools use this file to generate an abstract class that implements the interface and handles IPC, which you can then extend within your service.
In addition to what the docs say, the AIDL implementation involves writing boilerplate code for marshaling and unmarshaling of the transmitted data (using the Parcelable interface) with the ability to receive requests from multiple threads at a time, while the Messenger queues the messages and does the heavy lifting, but in a one request at a time fashion.
For Service-Activity interaction, you should use an asynchronous callback mechanism. The workaround is pretty straightforward, using EventBus library. It basically uses broadcastreceivers for message dispatching and communication between different components of your application.
I highly recommend you take a look at this tutorial and links, since EventBus is nowadays one the most highly-used libraries in android development.