{"id":5401,"date":"2020-01-29T00:00:00","date_gmt":"2020-01-29T00:00:00","guid":{"rendered":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/"},"modified":"2023-11-30T15:10:24","modified_gmt":"2023-11-30T14:10:24","slug":"your-app-is-not-alone","status":"publish","type":"post","link":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/","title":{"rendered":"Your app is not alone."},"content":{"rendered":"\n

Leveraging Android\u2019s openness to build task based flows across applications.\u00a0<\/p>\n\n\n\n

<\/p>\n\n\n\n

According to Andy Rubin<\/a>\u201a a co-founder of Android\u201a these few lines are what make Android an \u2018open\u2019 platform. These commands grant you access to the source code and allow you to build the operating system itself\u201a providing you with everything you need to create custom variants of the Android stack\u201a as well as porting devices and accessories to the platform.<\/p>\n\n\n\n

Over the years we have seen parts of the core system locked down\u201a whether via a move to proprietary software (e.g. Google Services)\u201a or agreements not to fork Android\u201a to ensure compatibility (e.g. The Open Handset Alliance<\/a>). For many developers\u201a however\u201a access to the source code is not what we mean when we refer to Android as an open platform.<\/p>\n\n\n\n

The openness within Android\u201a for myself at least\u201a comes with the unique ability to share data and create experiences across apps that are working together\u201a as well as the provision of hooks into the Android system itself. These allow for the enhancement or even replacement of parts of the OS. Many of these are powered by the Android Intent system\u201a which allows either explicit or implicit communication of abstract behaviours to be performed\u201a known as intents. <\/p>\n\n\n\n

An explicit intent is most commonly used within a single application. For example\u201a if the user presses a login button on an application\u201a an explicit intent can be used to launch the next screen or activity. Implicit intents\u201a on the other hand\u201a can be a lot more powerful as they allow the Android system to evaluate the desired intent. This is what powers the unique ability for users to replace default applications on their system\u201a such as their launcher (home screen)\u201a web browser\u201a email application\u201a clock application\u201a and more. Additionally\u201a it also allows developers to build apps that work together\u201a such that the user can move seamlessly between applications to achieve their goal. This is known as building task based flows.<\/p>\n\n\n\n

Apps are often considered to be silos of functionality and information\u201a kept separate from the rest of the system. On Android\u201a this isn\u2019t really the case. Apps are simply a collection of individual components that have been wired up to provide a cohesive experience\u201a often through implicit intents. But apps don\u2019t need to be defined solely by the functions they contain. They\u2019re capable of calling out to other applications\u201a and allowing other apps\u201a or the system itself\u201a to call functions within your own app\u201a ultimately allowing developers to build richer user experiences.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

A common example of this is the camera application. On Android\u201a you are not limited to the camera app that comes pre-installed on the device. Instead\u201a users can download alternatives from the Play Store and set them as the default camera app for the system.<\/p>\n\n\n\n

When an application is being developed\u201a there is often a requirement to allow users to take a photo – take\u201a for instance\u201a a social media application. In such an app\u201a a user may land on a screen where they can type some text into a text field\u201a and click a button if they wish to attach an image to their post. When this button is selected\u201a the app will broadcast an implicit intent to the Android system that it wishes to take a photograph\u201a and is then able to invoke a screen from the users preferred camera application\u201a allowing the social platform to outsource the task of capturing a photo and returning that data (example below). This represents a fairly simple use case.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

Building on that example\u201a we can see how we could expose our app\u2019s unique functionality to other apps and services\u201a or begin chaining applications together. This level of exposure to the rest of the system isn\u2019t just restricted to screens and functionality though – apps can also expose and share information through (permission restricted) content providers\u201a or broadcast and respond to events across the system.<\/p>\n\n\n\n

With content providers\u201a apps are able to read information from other places on a device (for example\u201a the user\u2019s contact list or setting preferences)\u201a which could be used to aid customisation of the experience your application offers users.<\/p>\n\n\n\n

Elsewhere with events\u201a the system broadcasts messages that apps can listen for and act upon. Similarly\u201a apps broadcast interesting messages that other applications can respond to. To exemplify\u201a an app can listen out for an event that indicates the device has connected to a specific bluetooth device\u201a and launch into a car mode. Another app\u201a meanwhile\u201a may listen out for a music playback started event. At this point it can query the music being played\u201a and provide the user with a link to the lyrics of the song.<\/p>\n\n\n\n

These examples list just some of the features that can be used in order to build open app experiences on Android\u201a and when properly utilised\u201a can help us to build task based flows for our users. By this\u201a we mean the flow a user takes when trying to achieve a task. <\/p>\n\n\n\n

To demonstrate\u201a imagine a user is trying to explain something visual to a friend over an instant messaging client. The task that they want to achieve is to find an image that aids their explanation\u201a The user also wants to annotate that image to add clarity before sharing it with their friend.<\/p>\n\n\n\n

Conventionally\u201a the flow for this task might involve the user opening up their web browser and performing an image search to find the appropriate image. They\u2019d then save this to their device\u201a return to their home screen\u201a open a drawing app\u201a import the image\u201a perform their annotations\u201a and save the image again. Finally\u201a they\u2019d go back to home\u201a open the messaging client\u201a begin the share flow with their friend\u201a find the image on the system\u201a and send it.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

The above flow involves a lot of breaks in relation to what the user wanted to achieve. On several occasions\u201a the user had to think about what app they needed to use to achieve the next step. The goal of task based flows is to remove these distractions\u201a allowing the user to focus on the task at hand. Using the Android intent system as opposed to the above flow\u201a a user can perform the image search within their browser to find the appropriate image\u201a share the image directly with a drawing application\u201a perform their annotations\u201a and then share the image again with the messaging client to send it to their friend.<\/p>\n\n\n\n

At any point in this flow\u201a the user is able to use any application they have on their device that is capable of performing the desired task. At no point did the user have to copy or save anything\u201a need to hit home and find the next app\u201a nor encounter limits to sharing with externally approved messaging clients. In a sense\u201a by exposing their functionality this way\u201a the apps organise themselves around the task\u201a allowing the user to seamlessly flow through while focusing solely on their goal and ultimately preventing distractions.<\/p>\n\n\n\n

As developers\u201a we should keep this in mind\u201a not only in order to consider how we expose our application to the rest of the system\u201a but also how we structure tasks within the apps themselves. We should be focused on exposing the functionality the app provides and building a flow that allows the user to achieve this task with minimal resistance. For instance\u201a if we structure an application such that each activity (an Android component) focuses on the completion of a task\u201a then we automatically get benefits such as a logical back stack\u201a narrower navigation paths and clearer animations that inform the user when they are at the start and end of their specific task. Additionally\u201a this ensures that if the application is extended at some point in the future to expose this task flow to other applications\u201a we are able to simply expose the activities intent (providing dependencies are handled)\u201a as opposed to restructuring the entire application.<\/p>\n\n\n\n

At the time of writing this blog post\u201a I was struggling to think about how to end a conversation about the openness of an open platform\u201a and so naturally\u201a I procrastinated. I did this for long enough that Google I\/O 2018 began\u201a and naturally absorbed my attention. There was a lot discussed at I\/O but one thing that struck me was a new \u2018Slices\u2019 and \u2018App Actions\u2019 API. The developer documentation talks about app actions as: \u2018a way to fill their [a user\u2019s] needs – at the moment they need it the most\u2019\u201a and is powered by none other than the intent system.<\/p>\n\n\n\n

App actions and slices can be registered by an application to handle one or more intents\u201a and allow developers to associate capabilities and content of their application with the intent embedded in other parts of the system. These actions have been nicknamed visual intents\u201a as they expose the intent handlers a developer includes within their application\u201a in the form of a button or other UI component. It is not too different from the implicit intents discussed above\u201a however instead of hard-coding the desired action (like a open camera button)\u201a Google is using a dynamic\u201a ever-growing list of ‘actions’\u201a as well as utilising machine learning to ensure your functionality appears throughout the system. Included in these places are the Android launcher\u201a smart text selection\u201a Google Search\u201a Google Assistant\u201a the Play Store\u201a and more.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

The above image shows App Actions<\/a> within Google Search to open the Fandango app to purchase Black Panther tickets or open the trailer for Black Panther in Youtube. <\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

The image here shows an action in the smart text selection to open the Spotify app on the Taylor Swift artist screen. <\/p>\n\n\n\n

Slices are more powerful than simple actions as they are customisable templates that allow developers to expose functionality of their app as a rich user experience within other applications. These templates aren\u2019t just static screens of your application embedded into places like the Google Assistant\u201a but can contain in line actions\u201a deep links back to your application\u201a scrolling content\u201a and controls like toggles\u201a sliders\u201a and buttons. Additionally\u201a your application can declare itself (or parts of itself) as a slice viewer\u201a allowing you to leverage the functionality of other apps within your own.<\/p>\n\n\n\n

Exposing these rich\u201a interactive components empowers developers to improve user acquisition and increase retention in the long-term by surfacing their functionality at a relevant time. Here we can see again that the Android system is focusing on organising itself around the user\u2019s goal as opposed to the user remembering what application can perform certain tasks\u201a and is doing so in a way the provides a simple\u201a intuitive\u201a experience for the user.<\/p>\n\n\n\n

The announcement of app actions and slices makes it clear that Google wants to encourage developers to expose the unique functionality of their application throughout the system. It also shows they believe that apps don\u2019t exist in isolation but can be integrated to deliver tailored experiences focused around a user\u2019s goal. To put it simply\u201a your app is not alone.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

A template of the Slices<\/a> API\u201a displaying an existing booking for an upcoming trip within the Google Search app.<\/p>\n\n\n\n

\"[object<\/figure>\n\n\n\n

Another Slice with interactive controls for requesting a ride via an Uber\/Lyft\/Taxi-style service.<\/p>\n","protected":false},"excerpt":{"rendered":"

Leveraging Android\u2019s openness to build task based flows across applications.\u00a0 According to Andy Rubin\u201a a co-founder of Android\u201a these few lines are what make Android an \u2018open\u2019 platform. These commands grant you access to the source code and allow you to build the operating system itself\u201a providing you with everything you need to create custom […]<\/p>\n","protected":false},"author":2,"featured_media":12007,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","inline_featured_image":false,"footnotes":""},"categories":[153,59,99],"tags":[773,149,158],"acf":[],"yoast_head":"\nYour app is not alone. | hedgehog lab<\/title>\n<meta name=\"description\" content=\"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Your app is not alone. | hedgehog lab\" \/>\n<meta property=\"og:description\" content=\"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/\" \/>\n<meta property=\"og:site_name\" content=\"hedgehog lab\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-29T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-30T14:10:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"450\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Antonia Hayianni\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonia Hayianni\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/\",\"url\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/\",\"name\":\"Your app is not alone. | hedgehog lab\",\"isPartOf\":{\"@id\":\"https:\/\/hedgehoglab.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png\",\"datePublished\":\"2020-01-29T00:00:00+00:00\",\"dateModified\":\"2023-11-30T14:10:24+00:00\",\"description\":\"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.\",\"breadcrumb\":{\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage\",\"url\":\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png\",\"contentUrl\":\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png\",\"width\":800,\"height\":450,\"caption\":\"Hand holding Android phone with menu icons showing on screen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/hedgehoglab.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Your app is not alone.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/hedgehoglab.com\/#website\",\"url\":\"https:\/\/hedgehoglab.com\/\",\"name\":\"hedgehog lab\",\"description\":\"Mobile App Developer in UK & USA\",\"publisher\":{\"@id\":\"https:\/\/hedgehoglab.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/hedgehoglab.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/hedgehoglab.com\/#organization\",\"name\":\"hedgehog lab\",\"url\":\"https:\/\/hedgehoglab.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/hedgehoglab.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/06\/Vector-3.svg\",\"contentUrl\":\"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/06\/Vector-3.svg\",\"width\":179,\"height\":149,\"caption\":\"hedgehog lab\"},\"image\":{\"@id\":\"https:\/\/hedgehoglab.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Your app is not alone. | hedgehog lab","description":"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/","og_locale":"en_GB","og_type":"article","og_title":"Your app is not alone. | hedgehog lab","og_description":"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.","og_url":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/","og_site_name":"hedgehog lab","article_published_time":"2020-01-29T00:00:00+00:00","article_modified_time":"2023-11-30T14:10:24+00:00","og_image":[{"width":800,"height":450,"url":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png","type":"image\/png"}],"author":"Antonia Hayianni","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Antonia Hayianni","Estimated reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/","url":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/","name":"Your app is not alone. | hedgehog lab","isPartOf":{"@id":"https:\/\/hedgehoglab.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage"},"image":{"@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage"},"thumbnailUrl":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png","datePublished":"2020-01-29T00:00:00+00:00","dateModified":"2023-11-30T14:10:24+00:00","description":"Android's open platform allows developers to build task-based flows across applications using implicit Intents. Learn how Android facilitates app communication through its Intent system to create seamless cross-app experiences.","breadcrumb":{"@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hedgehoglab.com\/your-app-is-not-alone\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#primaryimage","url":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png","contentUrl":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/11\/Smartphone-post-android-1.png","width":800,"height":450,"caption":"Hand holding Android phone with menu icons showing on screen"},{"@type":"BreadcrumbList","@id":"https:\/\/hedgehoglab.com\/your-app-is-not-alone\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hedgehoglab.com\/"},{"@type":"ListItem","position":2,"name":"Your app is not alone."}]},{"@type":"WebSite","@id":"https:\/\/hedgehoglab.com\/#website","url":"https:\/\/hedgehoglab.com\/","name":"hedgehog lab","description":"Mobile App Developer in UK & USA","publisher":{"@id":"https:\/\/hedgehoglab.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hedgehoglab.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/hedgehoglab.com\/#organization","name":"hedgehog lab","url":"https:\/\/hedgehoglab.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/hedgehoglab.com\/#\/schema\/logo\/image\/","url":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/06\/Vector-3.svg","contentUrl":"https:\/\/hedgehoglab.com\/wp-content\/uploads\/2023\/06\/Vector-3.svg","width":179,"height":149,"caption":"hedgehog lab"},"image":{"@id":"https:\/\/hedgehoglab.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/posts\/5401"}],"collection":[{"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/comments?post=5401"}],"version-history":[{"count":3,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/posts\/5401\/revisions"}],"predecessor-version":[{"id":12083,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/posts\/5401\/revisions\/12083"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/media\/12007"}],"wp:attachment":[{"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/media?parent=5401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/categories?post=5401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hedgehoglab.com\/wp-json\/wp\/v2\/tags?post=5401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}