Как было описано в предыдущих постах, looper и handler работают с очередью сообщений. Эта очередь реализована классом MessageQueue.
MessageQueue не имеет публичных методов для работы с сообщениями. Работа с очередью выполняется через методы класса Handler.

MessageQueue хранит объекты класса Message. В объекте message можно передать Bundle, который добавляется и получается методами setData() и getData().

Помимо data-bundle в message есть два публичных поля типа int: arg1 и arg2, а также публичное поле obj типа Object. Эти поля используются в тех случаях, когда нужно передать целочисленное значение или произвольный объект, и нет необходимости создавать bundle.

Также класс Message имеет публичное целочисленное поле what, которое по смыслу подобно параметру requestCode в методе startActivityForResult() и используется для определения о чем это сообщение.

Класс Message имеет публичный конструктор, но вместо него рекомендуется использовать статические методы Message.obtain() или Handler.obtainMessage(). Методы obtain возвращают message из пула объектов. После обработки сообщения нужно вызвать метод Message.recycler(), для освобождения связанных ресурсов и возвращения объекта message в пул.

Помимо объектов с данными в message можно задать callback типа Runnable, который будет вызван хэндлером после обработки сообщения. Для этого сообщение создается методом Message.obtain(handler: Handler, callback: Runnable).