• Like
App integration: Strategies and Tactics
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

App integration: Strategies and Tactics

  • 642 views
Published

from the AnDevCon III conference

from the AnDevCon III conference

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
642
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
11
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. AnDevCon IIIApp Integration: Strategies and Tactics Copyright © 2012CommonsWare, LLC
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 about capabilities 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 do Copyright © 2012CommonsWare, LLC
  • 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