This document discusses common patterns for implementing Android services using AIDL for inter-process communication. It begins by introducing services and AIDL, then discusses the challenges of using AIDL across processes. It presents two common patterns - the "lock" pattern for exclusive access to shared resources, and a "broadcast" pattern for simultaneous access. The lock pattern implementation uses worker threads and locks to serialize access. The broadcast pattern maintains listener lists to share updates with multiple clients.
2. Motivation
• Writing services is useful & fun
– Not to mention, painful !
• Documentation is present, but…
– Scattered
– Deals mostly with mechanics
• Can a 45 minute session make a difference ?
Android Service Patterns | DroidCon India 2011
3. Objectives
• Clarification on the term “Patterns”
– NOT design patterns a-la Grady Booch!
• This talk gives you
– Quick overview of AIDL based Services
– Features & Pains
– Writing useful services as patterns
Android Service Patterns | DroidCon India 2011
4. Intro to Android Services
• The “Service” concept
– Application component
– Typically used for long-running operations
– Does not automatically create
• new processes or threads
• Can be roughly classified based on
– Interaction Mechanism : Started, Bound
– Application Boundaries : In-process, IPC
Android Service Patterns | DroidCon India 2011
5. AIDL based IPC Services
• Android Interface Definition Language
• Inter-Process Communication to
– Expose interfaces to other applications
• More complicated than “Messenger”
Android Service Patterns | DroidCon India 2011
6. Why all the pain?
• “natural” interactions with the service
– Calls & callbacks
– With complex objects as parameters
• And all these across process boundaries!
Android Service Patterns | DroidCon India 2011
7. Hello, AIDL Service!
• Implements onBind()
– Exposes interface by implementing stubs
• Exports via AndroidManifest.xml
• Client apps bind via Intents
– Use interface methods
– Callbacks require app to implement stubs
corresponding to callback interface
Android Service Patterns | DroidCon India 2011
8. What’s not-so-nice there ?
• No control over binding
– onBind() return value is cached!
• No control over threading
• Code messier than in-process interface
– No support for exceptions
– Dead remote object exceptions => messy code
– Callbacks not invoked in UI context
• No concept of versioning
Android Service Patterns | DroidCon India 2011
9. Common Service Patterns
• Exclusive access to shared resource
– The “lock” pattern
• Simultaneous access to shared resource
– “serialize”, “broadcast” patterns
• Less common
– Service versioning
– Multiple objects of the same type
Android Service Patterns | DroidCon India 2011
10. The “lock” pattern
• Exclusive access using “locks”
– Take lock before use
– Release lock after use
• Looks simple ?
– Multi-app access
– Appropriate threading model
– Improper app lock handling => starvation
Android Service Patterns | DroidCon India 2011
11. Locked Service Implementation
• Associate locks with calling process
• Worker thread for serialization
– Started on service creation
– Producer-consumer modeling
• Java.util.concurrent provides ample support
• Partial solution for starvation
– Evict clients on DeadObjectException
Android Service Patterns | DroidCon India 2011
12. Shared Access Service
• “broadcast” method
– Shares a state update with multiple listeners
– Broadcast receivers don’t make the cut
• Can’t bind a Service inside them
• Implementation
– Reuse “listener” concept
• Clients add/remove listeners
– Service maintains list of listeners
• Updates listeners when needed
• Removes dead objects
– Reference : MindTheRobot Android Architecture Tutorial
Android Service Patterns | DroidCon India 2011