Build intelligent Android apps: In-app agentic workflows Google published a tutorial showing Android developers how to build cloud-hosted in-app agentic workflows using the Agent Development Kit (ADK), the AG-UI transport protocol, and the A2UI protocol to render interactive cards in Jetpack Compose. The post's example adds a Booking Assistant to the Jetpacker sample app that coordinates flights, hotels, museums, and restaurant reservations through a multi-agent backend, with a sample flight agent built on the gemini-3.1-flash-lite model and tools such as search_flights and reserve_flight. Google says the cloud backend approach keeps long-running, multi-step tasks running in the background while the Android app connects to the session, visualizes progress, and requests user input only when necessary. Welcome back to the blog post series "Build intelligent Android apps" where you take a basic Android app and transform it into a personalized, intelligent, and agentic experience. In our previous post https://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html you learned how to connect to the intelligence system using AppFunctions. In this post, you will learn how to build autonomous in-app agentic workflows running in the cloud. Sometimes a task is too complex for a single device session. For example, booking a complete holiday itinerary involves coordinating flight times, selecting hotel rooms, reserving museum tickets, and planning restaurant reservations. If you run this multi-step process directly on a mobile device, the app might get closed and lose your progress. Managing all these steps and API credentials on a phone also gets complicated quickly. For these long-running, multi-step workflows, you can use a custom self-hosted backend. The backend executes the booking agents in the background, while the Android app connects to the session, visualizes the progress, and requests user input only when necessary. Using a cloud-hosted agentic backend offers a few advantages: With these benefits in mind, we added a Booking Assistant to Jetpacker https://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html that coordinates flights, hotels, museums, and restaurant reservations. Let's look at how we orchestrated a multi-agent system powered by the Agent Development Kit ADK , with the Agent-User Interaction protocol AG-UI and Agent-to-User Interface protocol A2UI to send and display interactive cards natively in Jetpack Compose. Here is how to define a simple agent and run it using ADK: android/booking-server/booking server.py Note: ADK supports many different coding languages. For now, use the Python version as it includes support for A2UI which we'll use later in this blog post. from google.adk import Agent from google.adk.runners import InMemoryRunner from google.adk.tools import FunctionTool Define custom tools to interact with database def search flights destination: str, date: str - list str : In production, here you would query our flight database and return dynamic results return "10:00 AM", "2:00 PM" def reserve flight flight time: str - str: In production, here you would save the reservation transaction return "Reserved flight at " + flight time Instantiate the booking agent with specialized tools flight agent = Agent name="Flight Booker", model="gemini-3.1-flash-lite", instruction="Help the user search for flights and book a reservation.", tools= FunctionTool search flights , FunctionTool reserve flight, require confirmation=True Run the agent in memory using a session ID runner = InMemoryRunner flight agent async for event in runner.run async user id=user id, session id=session id : if event.content: print "Agent said:", event.content When you run an agent using this setup, ADK manages the execution steps for you. It automatically tracks the conversation context, routes messages between the user and the model, and executes the registered tools when the model requests them. This allows you to focus on writing clean procedural logic while the framework handles the orchestration in the background. To connect this backend agent to our Jetpacker app, the server needs a way to stream updates in real time to the device, which is handled using the AG-UI protocol . The agent also needs a structured way to describe and update interactive components like option selectors and seating grids dynamically on the phone, which is where the A2UI protocol comes in. AG-UI is a bidirectional transport layer protocol that standardizes message types between agents and UI clients. The agent can inform the client of lifecycle events, text messages, tool calls, and state management. The client, in turn, can send user text messages, tool call results, and custom action events back to the agent. On the server side, it yields updates formatted as standard Server-Sent Events like event: TEXT MESSAGE CONTENT containing the JSON delta . On Android, the Kotlin SDK listens to this stream and automatically maps the payloads to type-safe client events: // https://github.com/android/ai-samples/tree/main/jetpacker/android/feature/trip/booking assistant/src/main/kotlin/com/example/jetpacker/feature/booking assistant/BookingAssistantViewModel.kt import com.agui.client.agent.HttpAgent import com.agui.client.agent.HttpAgentConfig import com.agui.core.types.RunAgentInput import com.agui.core.types.UserMessage import com.agui.core.types.TextMessageStartEvent import com.agui.core.types.TextMessageContentEvent import com.agui.core.types.TextMessageEndEvent val config = HttpAgentConfig agentId = "booking-assistant", threadId = threadId, url = "https://