App integration: Strategies and Tactics

Download App integration: Strategies and Tactics

Post on 14-May-2015




3 download

Embed Size (px)


from the AnDevCon III conference


  • 1.AnDevCon IIIApp Integration: Strategies and Tactics Copyright 2012CommonsWare, LLC

2. Objective: Add Value Add Value for Users More functionality without as muchdevelopment effort Add Value for Third Parties Their apps are more valuable when you helpdrive their adoption Add Value for You Reciprocity from third parties Copyright 2012CommonsWare, LLC 3. Integration Models Peers Apps with value independent of yours Hard or soft dependencies Plugins Apps with no value independent of yoursCopyright 2012CommonsWare, LLC 4. Activities, Implicit Intents Make a Generic Request ACTION_VIEW, ACTION_SEND, etc. User Dictates Terms What applications are installed that could handleit What application to use for this particularrequest What to do with that application Copyright 2012CommonsWare, LLC 5. Activities, Implicit Intents Making the Selection No options? Crash! One option? Automatic start, no intervention Multiple options? Default chooser Override chooser (Intent.createChooser()) ShareActionProvider DIYCopyright 2012CommonsWare, LLC 6. Activities, Implicit Intents DIY PackageManagerqueryIntentActivities() returns list ofpossibilities, given an Intent You render resulting List somehow Avoiding the No-Options Crash Same technique: if list empty,startActivity() would failCopyright 2012CommonsWare, LLC 7. Activities, Explicit Intents Hard Dependency, Declared in Code Craft Intent that will only be handled by peerapplication Use PackageManagerqueryIntentActivities() to confirm itexists (or handle the exception) Use with startActivity() /startActivityForResult() Example: Barcode Scanner (ZXing)Copyright 2012CommonsWare, LLC 8. UI Integration via Web No Activity? How About a Web Site? Easy: launch browser on URL with ACTION_VIEW More Interesting: Host a WebView Pre-fill in forms using loadUrl(javascript:...) Warning #1: May be tough to control Warning #2: Dependencies on non-public APIsCopyright 2012CommonsWare, LLC 9. UI Integration via RemoteViews Two Apps UIs Simultaneously RemoteViews Host Get RemoteViews from third-party Broadcast? Remote service? Initially, plus changes over time apply() RemoteViews into your desiredcontainer Copyright 2012CommonsWare, LLC 10. UI Integration via RemoteViews Limitations Widgets, methods available in RemoteViews Solution: DIY replacement data structure No direct interaction between apps Solution: API accessed via PendingIntentsCopyright 2012CommonsWare, LLC 11. Integrating Resources createPackageContext() Returns a Context that will resolve resourcesfrom some other package Example Use: theme packs APK (possibly paid app) with res0urces representing theme Detect existence using PackageManager Use createPackageContext() to retrieve resources and apply to your UICopyright 2012CommonsWare, LLC 12. Integrating Code Option #1: createPackageContext() getClassLoader() will return ClassLoaderfor accessing classes in other APK Use CONTEXT_INCLUDE_CODE in createPackageContext() call Use reflection from there (e.g., loadClass())to access foreign codeCopyright 2012CommonsWare, LLC 13. Integrating Code Option #2: DexClassLoader Given JAR/APK containing dexd bytecode,allows you to load classes just like a regularClassLoader Up to you to get the JAR or APK file Copyright 2012CommonsWare, LLC 14. Integrating Code WARNING You might not know where that code came from Code injection attacks Executed code runs with your permissions May do things you rather wish they would not Net: very risky techniqueCopyright 2012CommonsWare, LLC 15. Integration by ContentProvider All You Need is a Uri And some idea of what the schema is, so youknow what to do with it Example: plugins implementing a standard schema that you require Getting the Uri Well-known resource name Bootstrap API (e.g., broadcast, remote service) Copyright 2012CommonsWare, LLC 16. Integration by ContentProvider The Permission Proxy Problem: Your app needs too many permissions Example: Calendar integration Solution Wrap OS/third-party ContentProvider in one of yours, with same schema Put that ContentProvider in plugin, to isolate permission Check signature to ensure only used by youCopyright 2012CommonsWare, LLC 17. Integration by Service Command Pattern Third Party Supplies Intent Structure Action string Available extras Call startService() as Needed Directly Via PendingIntent (e.g., AlarmManager) Copyright 2012CommonsWare, LLC 18. Integration by Service Binding Pattern Agreed-Upon AIDL Peer: first mover Plugin: host defines Third Party Implements AIDL Binder You Bind and Use Copyright 2012CommonsWare, LLC 19. Integration by Broadcast Agreed-Upon Action, Ordered vs. Regular Peer: first mover Plugin: host defines One Side Broadcast, Other Side Receives Manifest-registered receiver registerReceiver() Copyright 2012CommonsWare, LLC 20. Discovery Mechanisms Hard-Coded Discovery via Broadcast Host sends a broadcast periodically (first run,package installed, package removed) Peers/plugins reply with broadcast aboutcapabilities Copyright 2012CommonsWare, LLC 21. Discovery Mechanisms Discovery via Naming Convention Plugins go in com.myfirm.myapp.plugin.* Host uses PackageManager to identify Further Handshaking Well-known resource Well-known narrowcast via setPackage() Copyright 2012CommonsWare, LLC 22. More Stuff to Consider Custom Permissions Users should get a vote on data sharing Integration Library JAR to ease third-parties working with your host Documentation Only way anyone will know what to do ...and what you would rather they not doCopyright 2012CommonsWare, LLC 23. What the Ecosystem Needs Standards Community-driven implicit Intent actions Scaffolding Library projects, templates for creating thesestructures End-User Discovery How do they know what can integrate? Copyright 2012CommonsWare, LLC