{"id":36979,"date":"2024-11-01T09:53:48","date_gmt":"2024-11-01T09:53:48","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=36979"},"modified":"2024-11-01T11:42:44","modified_gmt":"2024-11-01T11:42:44","slug":"kotlin-android-app-development-course-understanding-services","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/36979\/","title":{"rendered":"kotlin android app development course, understanding services"},"content":{"rendered":"<p><body><\/p>\n<p>\n        In Android app development, a <strong>Service<\/strong> is a component that can perform operations in the background independently of the application&#8217;s UI. Even when the user is not interacting with the application, various tasks can continue to be performed through the service. In this tutorial, we will learn about the concept of services, types, lifecycle, and how to implement services using Kotlin.\n    <\/p>\n<h2>1. What is a Service?<\/h2>\n<p>\n        A service is a component in Android that handles <strong>background tasks<\/strong> and operates independently of the user interface (UI). For example, tasks like music playback, file downloads, or data processing can continue running regardless of the user interface.\n    <\/p>\n<p>\n        A service is one of the functionalities of an application and is mainly used for:\n    <\/p>\n<ul>\n<li>Streaming music<\/li>\n<li>Streaming video<\/li>\n<li>Downloading and uploading files<\/li>\n<li>Data synchronization tasks<\/li>\n<\/ul>\n<h2>2. Types of Services<\/h2>\n<p>\n        Android services can be broadly classified into two types:\n    <\/p>\n<h3>2.1. Started Service<\/h3>\n<p>\n        A started service can be initiated by calling the <code>startService()<\/code> method. Once started, the service runs independently and continues until the user stops it. The user can stop the service as needed using <code>stopSelf()<\/code> or <code>stopService()<\/code> methods.\n    <\/p>\n<pre><code class=\"language-kotlin\">class MyStartedService : Service() {\n        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n            \/\/ Perform operation\n            return START_STICKY\n        }\n\n        override fun onBind(intent: Intent?): IBinder? {\n            return null\n        }\n\n        override fun onDestroy() {\n            super.onDestroy()\n        }\n    }<\/code><\/pre>\n<h3>2.2. Bound Service<\/h3>\n<p>\n        A bound service is a service that is connected to other components (e.g., Activity) to share data and methods. It can be connected using the <code>bindService()<\/code> method, and it may be terminated when the connection is lost.\n    <\/p>\n<pre><code class=\"language-kotlin\">class MyBoundService : Service() {\n        private val binder = MyBinder()\n\n        inner class MyBinder : Binder() {\n            fun getService(): MyBoundService = this@MyBoundService\n        }\n\n        override fun onBind(intent: Intent?): IBinder {\n            return binder\n        }\n    }<\/code><\/pre>\n<h2>3. Lifecycle of a Service<\/h2>\n<p>\n        The lifecycle of a service differs slightly from that of an Activity. A service can have the following states:\n    <\/p>\n<ul>\n<li><strong>Started:<\/strong> The state when the service has started<\/li>\n<li><strong>Running:<\/strong> The state when the service is performing operations in the background<\/li>\n<li><strong>Stopped:<\/strong> The state when the service has stopped<\/li>\n<\/ul>\n<p>\n        The lifecycle methods of a service are:\n    <\/p>\n<ul>\n<li><code>onCreate()<\/code>: Called when the service is created.<\/li>\n<li><code>onStartCommand()<\/code>: Called when the service starts.<\/li>\n<li><code>onBind()<\/code>: Called when another component binds to the service.<\/li>\n<li><code>onUnbind()<\/code>: Called when the binding to the service is released.<\/li>\n<li><code>onDestroy()<\/code>: Called when the service is destroyed.<\/li>\n<\/ul>\n<h3>3.1. Example of Service Lifecycle<\/h3>\n<pre><code class=\"language-kotlin\">class MyService : Service() {\n        override fun onCreate() {\n            super.onCreate()\n            Log.d(\"MyService\", \"Service Created\")\n        }\n\n        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n            Log.d(\"MyService\", \"Service Started\")\n            return START_STICKY\n        }\n\n        override fun onBind(intent: Intent?): IBinder? {\n            return null\n        }\n\n        override fun onDestroy() {\n            Log.d(\"MyService\", \"Service Destroyed\")\n            super.onDestroy()\n        }\n    }<\/code><\/pre>\n<h2>4. Implementing a Service<\/h2>\n<p>\n        Now let&#8217;s implement a simple started service using Kotlin. This service will perform a task in the background for 10 seconds before stopping.\n    <\/p>\n<h3>4.1. Project Setup<\/h3>\n<ol>\n<li>Open Android Studio and create a new project.<\/li>\n<li>Select the Minimum API Level (e.g., API 21 &#8211; Lollipop).<\/li>\n<li>Choose the Empty Activity template and set the project name.<\/li>\n<\/ol>\n<h3>4.2. Creating the Service Class<\/h3>\n<p>\nCreate a service named <code>MyService<\/code>.\n    <\/p>\n<pre><code class=\"language-kotlin\">class MyService : Service() {\n        override fun onCreate() {\n            super.onCreate()\n            Log.d(\"MyService\", \"Service Created\")\n        }\n\n        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n            Log.d(\"MyService\", \"Service Started\")\n            \/\/ Perform background operation\n            Thread {\n                \/\/ Wait for 10 seconds before stopping the service\n                Thread.sleep(10000)\n                stopSelf()\n            }.start()\n            return START_STICKY\n        }\n\n        override fun onBind(intent: Intent?): IBinder? {\n            return null\n        }\n\n        override fun onDestroy() {\n            Log.d(\"MyService\", \"Service Destroyed\")\n            super.onDestroy()\n        }\n    }<\/code><\/pre>\n<h3>4.3. Registering the Service in AndroidManifest.xml<\/h3>\n<pre><code>&lt;service android:name=\".MyService\"&gt;&lt;\/service&gt;<\/code><\/pre>\n<h3>4.4. Starting the Service<\/h3>\n<p>\nAdd code to start the service in <code>MainActivity<\/code>.\n    <\/p>\n<pre><code class=\"language-kotlin\">class MainActivity : AppCompatActivity() {\n        override fun onCreate(savedInstanceState: Bundle?) {\n            super.onCreate(savedInstanceState)\n            setContentView(R.layout.activity_main)\n\n            val startServiceButton = findViewById<button>(R.id.start_service_button)\n            startServiceButton.setOnClickListener {\n                val serviceIntent = Intent(this, MyService::class.java)\n                startService(serviceIntent)\n            }\n        }\n    }<\/button><\/code><\/pre>\n<h3>4.5. Running and Testing the App<\/h3>\n<p>\n        After running the app, clicking the &#8220;Start Service&#8221; button will show the messages &#8220;Service Created&#8221;, &#8220;Service Started&#8221;, and &#8220;Service Destroyed&#8221; in the logcat.\n    <\/p>\n<h2>5. Services and Threads<\/h2>\n<p>\n        If long operations are performed in the onStartCommand() method of a service, an ANR (Application Not Responding) error may occur. Therefore, it is recommended to delegate operations that run in the background to a Thread, AsyncTask, or Coroutine.\n    <\/p>\n<h3>5.1. Using Kotlin Coroutines<\/h3>\n<p>\n        Using Kotlin&#8217;s Coroutines allows for easy handling of asynchronous tasks. Here is an example of implementing a service using Coroutine.\n    <\/p>\n<pre><code class=\"language-kotlin\">class MyCoroutineService : Service() {\n        private val job = Job()\n        private val coroutineScope = CoroutineScope(Dispatchers.Main + job)\n\n        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n            coroutineScope.launch {\n                \/\/ Wait for 10 seconds\n                delay(10000)\n                Log.d(\"MyCoroutineService\", \"Service Completed\")\n                stopSelf()\n            }\n            return START_STICKY\n        }\n\n        override fun onBind(intent: Intent?): IBinder? {\n            return null\n        }\n\n        override fun onDestroy() {\n            job.cancel()\n            super.onDestroy()\n        }\n    }<\/code><\/pre>\n<h2>6. Conclusion<\/h2>\n<p>\n        In this tutorial, we explored the concept, types, lifecycle, and implementation methods of services in Android app development using Kotlin. Services are useful for performing tasks in the background and are a key component of Android applications.\n    <\/p>\n<p>\n        In the next tutorial, we will cover BroadcastReceiver and IntentService, so stay tuned!\n    <\/p>\n<footer>\n<p>\u00a9 2023 Android Development Course. All rights reserved.<\/p>\n<\/footer>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Android app development, a Service is a component that can perform operations in the background independently of the application&#8217;s UI. Even when the user is not interacting with the application, various tasks can continue to be performed through the service. In this tutorial, we will learn about the concept of services, types, lifecycle, and &hellip; <a href=\"https:\/\/atmokpo.com\/w\/36979\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;kotlin android app development course, understanding services&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[143],"tags":[],"class_list":["post-36979","post","type-post","status-publish","format-standard","hentry","category-kotlin-android-app-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/36979\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"In Android app development, a Service is a component that can perform operations in the background independently of the application&#8217;s UI. Even when the user is not interacting with the application, various tasks can continue to be performed through the service. In this tutorial, we will learn about the concept of services, types, lifecycle, and &hellip; \ub354 \ubcf4\uae30 &quot;kotlin android app development course, understanding services&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/36979\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:53:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:42:44+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"kotlin android app development course, understanding services\",\"datePublished\":\"2024-11-01T09:53:48+00:00\",\"dateModified\":\"2024-11-01T11:42:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/\"},\"wordCount\":550,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Kotlin Android app development\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/\",\"url\":\"https:\/\/atmokpo.com\/w\/36979\/\",\"name\":\"kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:53:48+00:00\",\"dateModified\":\"2024-11-01T11:42:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/36979\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/36979\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"kotlin android app development course, understanding services\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","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:\/\/atmokpo.com\/w\/36979\/","og_locale":"ko_KR","og_type":"article","og_title":"kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"In Android app development, a Service is a component that can perform operations in the background independently of the application&#8217;s UI. Even when the user is not interacting with the application, various tasks can continue to be performed through the service. In this tutorial, we will learn about the concept of services, types, lifecycle, and &hellip; \ub354 \ubcf4\uae30 \"kotlin android app development course, understanding services\"","og_url":"https:\/\/atmokpo.com\/w\/36979\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:53:48+00:00","article_modified_time":"2024-11-01T11:42:44+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/36979\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/36979\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"kotlin android app development course, understanding services","datePublished":"2024-11-01T09:53:48+00:00","dateModified":"2024-11-01T11:42:44+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/36979\/"},"wordCount":550,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Kotlin Android app development"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/36979\/","url":"https:\/\/atmokpo.com\/w\/36979\/","name":"kotlin android app development course, understanding services - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:53:48+00:00","dateModified":"2024-11-01T11:42:44+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/36979\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/36979\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/36979\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"kotlin android app development course, understanding services"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=36979"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36979\/revisions"}],"predecessor-version":[{"id":36980,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/36979\/revisions\/36980"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=36979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=36979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=36979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}