Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
AnDevCon IIIApp Integration: Strategies and     Tactics     Copyright © 2012CommonsWare, LLC
Objective: Add Value●   Add Value for Users    –   More functionality without as much        development effort●   Add Val...
Integration Models●   Peers    –   Apps with value independent of yours    –   Hard or soft dependencies●   Plugins    –  ...
Activities, Implicit Intents●   Make a Generic Request    –   ACTION_VIEW, ACTION_SEND, etc.●   User Dictates Terms    –  ...
Activities, Implicit Intents●   Making the Selection    –   No options? Crash!    –   One option? Automatic start, no inte...
Activities, Implicit Intents●   DIY    –   PackageManager        queryIntentActivities() returns list of        possibilit...
Activities, Explicit Intents●   Hard Dependency, Declared in Code    –   Craft Intent that will only be handled by peer   ...
UI Integration via Web●   No Activity? How About a Web Site?    –   Easy: launch browser on URL with ACTION_VIEW    –   Mo...
UI Integration via RemoteViews●   Two Apps UIs Simultaneously●   RemoteViews Host    –   Get RemoteViews from third-party ...
UI Integration via RemoteViews●   Limitations    –   Widgets, methods available in RemoteViews         ●   Solution: DIY r...
Integrating Resources●   createPackageContext()    –   Returns a Context that will resolve resources        from some othe...
Integrating Code●   Option #1: createPackageContext()    –   getClassLoader() will return ClassLoader        for accessing...
Integrating Code●   Option #2: DexClassLoader    –   Given JAR/APK containing dexd bytecode,        allows you to load cla...
Integrating Code●   WARNING    –   You might not know where that code came from         ●   Code injection attacks    –   ...
Integration by ContentProvider●   All You Need is a Uri    –   And some idea of what the schema is, so you        know wha...
Integration by ContentProvider●   The Permission Proxy    –   Problem: Your app needs too many permissions         ●   Exa...
Integration by Service●   Command Pattern    –   Third Party Supplies Intent Structure         ●   Action string         ●...
Integration by Service●   Binding Pattern    –   Agreed-Upon AIDL         ●   Peer: first mover         ●   Plugin: host d...
Integration by Broadcast●   Agreed-Upon Action, Ordered vs. Regular    –   Peer: first mover    –   Plugin: host defines● ...
Discovery Mechanisms●   Hard-Coded●   Discovery via Broadcast    –   Host sends a broadcast periodically (first run,      ...
Discovery Mechanisms●   Discovery via Naming Convention    –   Plugins go in com.myfirm.myapp.plugin.*    –   Host uses Pa...
More Stuff to Consider●   Custom Permissions    –   Users should get a vote on data sharing●   Integration Library    –   ...
What the Ecosystem Needs●   Standards    –   Community-driven implicit Intent actions●   Scaffolding    –   Library projec...
Upcoming SlideShare
Loading in …5
×

App integration: Strategies and Tactics

1,017 views

Published on

from the AnDevCon III conference

Published in: Technology
  • Be the first to comment

App integration: Strategies and Tactics

  1. 1. AnDevCon IIIApp Integration: Strategies and Tactics Copyright © 2012CommonsWare, LLC
  2. 2. Objective: Add Value● Add Value for Users – More functionality without as much development effort● Add Value for Third Parties – Their apps are more valuable when you help drive their adoption● Add Value for You – Reciprocity from third parties Copyright © 2012CommonsWare, LLC
  3. 3. Integration Models● Peers – Apps with value independent of yours – Hard or soft dependencies● Plugins – Apps with no value independent of yours Copyright © 2012CommonsWare, LLC
  4. 4. Activities, Implicit Intents● Make a Generic Request – ACTION_VIEW, ACTION_SEND, etc.● User Dictates Terms – What applications are installed that could handle it – What application to use for this particular request – What to do with that application Copyright © 2012CommonsWare, LLC
  5. 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 ● DIY Copyright © 2012CommonsWare, LLC
  6. 6. Activities, Implicit Intents● DIY – PackageManager queryIntentActivities() returns list of possibilities, given an Intent – You render resulting List somehow● Avoiding the No-Options Crash – Same technique: if list empty, startActivity() would fail Copyright © 2012CommonsWare, LLC
  7. 7. Activities, Explicit Intents● Hard Dependency, Declared in Code – Craft Intent that will only be handled by peer application – Use PackageManager queryIntentActivities() to confirm it exists (or handle the exception) – Use with startActivity() / startActivityForResult()● Example: Barcode Scanner (ZXing) Copyright © 2012CommonsWare, LLC
  8. 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 “APIs” Copyright © 2012CommonsWare, LLC
  9. 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 desired container Copyright © 2012CommonsWare, LLC
  10. 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 PendingIntents Copyright © 2012CommonsWare, LLC
  11. 11. Integrating Resources● createPackageContext() – Returns a Context that will resolve resources from 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 UI Copyright © 2012CommonsWare, LLC
  12. 12. Integrating Code● Option #1: createPackageContext() – getClassLoader() will return ClassLoader for accessing classes in other APK ● Use CONTEXT_INCLUDE_CODE in createPackageContext() call – Use reflection from there (e.g., loadClass()) to access foreign code Copyright © 2012CommonsWare, LLC
  13. 13. Integrating Code● Option #2: DexClassLoader – Given JAR/APK containing dexd bytecode, allows you to load classes just like a regular ClassLoader ● Up to you to get the JAR or APK file Copyright © 2012CommonsWare, LLC
  14. 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 technique Copyright © 2012CommonsWare, LLC
  15. 15. Integration by ContentProvider● All You Need is a Uri – And some idea of what the schema is, so you know 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. 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 you Copyright © 2012CommonsWare, LLC
  17. 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. 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. 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. 20. Discovery Mechanisms● Hard-Coded● Discovery via Broadcast – Host sends a broadcast periodically (first run, package installed, package removed) – Peers/plugins reply with broadcast about capabilities Copyright © 2012CommonsWare, LLC
  21. 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. 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 do Copyright © 2012CommonsWare, LLC
  23. 23. What the Ecosystem Needs● Standards – Community-driven implicit Intent actions● Scaffolding – Library projects, templates for creating these structures● End-User Discovery – How do they know what can integrate? Copyright © 2012CommonsWare, LLC

×