{"id":977,"date":"2021-10-21T16:13:37","date_gmt":"2021-10-21T07:13:37","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=977"},"modified":"2025-09-12T17:25:55","modified_gmt":"2025-09-12T08:25:55","slug":"android-onactivityresult%ec%9d%98-%eb%8c%80%ec%95%88-registerforactivityresult","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2021\/10\/21\/977\/","title":{"rendered":"Android: onActivityResult()\uc758 \ub300\uc548 RegisterForActivityResult()"},"content":{"rendered":"\n<p> \uc678\ubd80 Activity\ub97c \uc2e4\ud589\ud560 \ub54c, \uc774\uc804 \ubc29\uc2dd\uc740 startActivityForResult()\ub97c \uc774\uc6a9\ud558\uc5ec Intent\ub97c \ub0a0\ub9ac\uace0 onActivityResult() callback\uc73c\ub85c \uacb0\uacfc\ub97c \ubc1b\uc544\uc624\ub294 \ubc29\uc2dd\uc774\uc5c8\ub2e4. \uc0c8\ub86d\uac8c \uad8c\uc7a5\ud558\ub294 \ubc29\uc2dd\uc740 AndroidX \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 Activity\/Fragment \ub97c \uc774\uc6a9\ud558\uc5ec RegisterForActivityResult()\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. <\/p>\n\n\n\n<p> \uc815\ud655\ud55c \uc7a5\uc810\uc744 \uc124\uba85\ud558\uae30\uc5d0 \uc544\uc9c1 \ub0b4 \uc774\ud574\ub3c4\uac00 \ubd80\uc871\ud558\uc9c0\ub9cc, \uae30\uc874 \ubc29\uc2dd\uc774 \uc880 \ubb34\uc2dd\ud558\uae34 \ud588\ub2e4. \uc778\ud150\ud2b8\ub85c \uc678\ubd80 \uc561\ud2f0\ube44\ud2f0\ub97c \uc2e4\ud589\ud558\uace0, \ubb58 \uc2e4\ud589\ud588\ub4e0\uc9c0 onActivityResult() \ud558\ub098\uc758 \ucf5c\ubc31\uc5d0\uc11c request code\ub85c \ubd84\ub958\ud558\uba70 \uc804\ubd80 \ucc98\ub9ac\ud574\uc57c \ud588\ub2e4. \ub610\ud55c, \uc778\ud150\ud2b8 \uc124\uc815, \ud504\ub798\uadf8\uba3c\ud2b8 \ub0b4\uc5d0\uc11c \ud638\ucd9c\uc2dc \uc798\ubabb\ub41c \uc0ac\uc6a9\ub4f1\uc73c\ub85c onActivityResult()\uac00 \uc81c\ub300\ub85c \ud638\ucd9c\ub418\uc9c0 \uc54a\ub294 \uacbd\uc6b0\ub3c4 \ub9ce\uc558\ub2e4. \ubcc0\uacbd\ub41c \ubc29\uc2dd\uc758 \uc7a5\uc810\uc774 \ub9ce\uc774 \uc788\uc9c0\ub9cc \uadf8\uc911 \ud558\ub098\ub97c \uaf3d\uc790\uba74, \ubcf5\uc7a1\ud55c permission \uc694\uccad\uacfc\uc815\uc774 \ub2e8\uc21c\ud574\uc9c4\ub2e4. \uc8fc\uc800\ud560 \uc774\uc720\uac00 \uc5c6\ub2e4. \uae30\uc874 \ubc29\uc2dd\uc744 \ube68\ub9ac \uc78a\uace0 \uc0c8\ub85c\uc6b4 \ubc29\uc2dd\uc744 \uc54c\uc544\ubcf4\ub3c4\ub85d \ud558\uc790.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uc0c8\ub85c\uc6b4 API\ub294 registerForActivityResult()\uc774\ub2e4. \uc774\ub294 androidx.activity\ub098 androidx.fragment\uc5d0\uc11c \uc81c\uacf5\ub418\ub294\ub370, \ub2e4\uc74c\uacfc \uac19\uc740 \uc758\uc874\uc131 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ucd94\uac00\ud574\ub3c4 \ub418\uc9c0\ub9cc, \uc544\ub9c8\ub3c4 androidx.appcompat \uc5d0 \ud3ec\ud568\ub418\uc5c8\ub294\uc9c0 \ucd94\uac00\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>    \/\/ activity, fragment for permissions\n    implementation \"androidx.activity:activity-ktx:1.3.1\"\n    implementation \"androidx.fragment:fragment-ktx:1.3.6\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ activity, fragment for permissions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.activity:activity-ktx:1.3.1&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.fragment:fragment-ktx:1.3.6&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>registerForActivityResult()\ub294 \ub450\uac1c\uc758 \uc778\uc790\ub97c \uc785\ub825\ubc1b\ub294\ub2e4. \ud558\ub098\ub294 ActivityResultContract\uc774\uace0, \ub098\uba38\uc9c0 \ud558\ub098\ub294 ActivityResultCallback\uc774\ub2e4. Contract\ub294 \uc2e4\ud589\ud560 activity\uc815\ubcf4, \uc785\ucd9c\ub825 \uac12\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac16\uac8c\ub41c\ub2e4. \uc0ac\uc6a9\uc790\uac00 custom\uc73c\ub85c \uc815\uc758\ud560 \uc218\ub3c4 \uc788\uc73c\ub098, <a href=\"https:\/\/developer.android.com\/reference\/androidx\/activity\/result\/contract\/ActivityResultContracts\">\uae30\ubcf8 \uac12\ub4e4\uc744 \uc81c\uacf5<\/a>\ud558\uace0 \uc788\uc73c\ub2c8 \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4.  Callback\uc740 Contract\uc758 \ucd9c\ub825\uac12\uc5d0 \ub300\ud574 \uc2e4\ud589\ub418\ub294 callback \ud568\uc218\uac00 \ub4e4\uc5b4\uac04\ub2e4. callback\uc740 \ub78c\ub2e4\ud568\uc218 \ud615\ud0dc\ub97c \uc0ac\uc6a9\ud558\uba74 \ucf54\ub4dc\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ub2e8\uc21c\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->\n    \/\/ Handle the returned Uri\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> getContent <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">GetContent<\/span><span style=\"color: #ADBAC7\">()) { uri: <\/span><span style=\"color: #F69D50\">Uri<\/span><span style=\"color: #ADBAC7\">? -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ Handle the returned Uri<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Contract\ub85c GetContent()\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294\ub370, \uc774\ub294 content:\/\/Uri \ud615\uc2dd\uc744 \ubc1b\ub294 \uae30\ubcf8 \uc81c\uacf5 Contract\uc774\ub2e4. <\/p>\n\n\n\n<p>registerForActivityResult()\ub294 \ud638\ucd9c\uc2dc Contract\uc640 Callback\uc744 \ub4f1\ub85d\ub9cc\ud558\uace0 \ubc14\ub85c \uc2e4\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4. \ub300\uc2e0 ActivityResultLauncher\ub97c \ub9ac\ud134\ud558\ub294\ub370, \uc774 \ub9ac\ud134\ubc1b\uc740 Launcher\uc758 launch()\ub97c \ud638\ucd9c\ud574\uc11c \uc2e4\ud589\ud558\uac8c \ub41c\ub2e4. \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->\n    \/\/ Handle the returned Uri\n}\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n    \/\/ ...\n\n    val selectButton = findViewById&lt;Button>(R.id.select_button)\n\n    selectButton.setOnClickListener {\n        \/\/ Pass in the mime type you'd like to allow the user to select\n        \/\/ as the input\n        getContent.launch(\"image\/*\")\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> getContent <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">GetContent<\/span><span style=\"color: #ADBAC7\">()) { uri: <\/span><span style=\"color: #F69D50\">Uri<\/span><span style=\"color: #ADBAC7\">? -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ Handle the returned Uri<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ ...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> selectButton <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">findViewById<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Button<\/span><span style=\"color: #ADBAC7\">&gt;(R.id.select_button)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    selectButton.<\/span><span style=\"color: #DCBDFB\">setOnClickListener<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ Pass in the mime type you&#39;d like to allow the user to select<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ as the input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        getContent.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;image\/*&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uc0c8\ub85c\uc6b4 \ubc29\uc2dd\uc774 \uae30\uc874 \ubc29\uc2dd\uacfc \uc644\uc804\ud788 \ucc28\ubcc4\ud654 \ub420 \uc218 \uc788\ub294 \uc774\uc720\ub85c, Activity\ub098 Fragment\uac00\uc544\ub2cc \ubcc4\ub3c4\uc758 \ud074\ub798\uc2a4\uc5d0\uc11c activity result\ub97c \ubc1b\uc744 \uc218 \uc788\ub2e4. \uadf8 \ubc29\ubc95\uc740 ActivityResultRegistry\ub97c \uc9c1\uc811 \uc774\uc6a9\ud558\ub294 \uac83\uc774\ub2e4. \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class MyLifecycleObserver(private val registry : ActivityResultRegistry)\n        : DefaultLifecycleObserver {\n    lateinit var getContent : ActivityResultLauncher&lt;String>\n\n    override fun onCreate(owner: LifecycleOwner) {\n        getContent = registry.register(\"key\", owner, GetContent()) { uri ->\n            \/\/ Handle the returned Uri\n        }\n    }\n\n    fun selectImage() {\n        getContent.launch(\"image\/*\")\n    }\n}\n\nclass MyFragment : Fragment() {\n    lateinit var observer : MyLifecycleObserver\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        \/\/ ...\n\n        observer = MyLifecycleObserver(requireActivity().activityResultRegistry)\n        lifecycle.addObserver(observer)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val selectButton = view.findViewById&lt;Button>(R.id.select_button)\n\n        selectButton.setOnClickListener {\n            \/\/ Open the activity to select an image\n            observer.selectImage()\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyLifecycleObserver<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> registry : <\/span><span style=\"color: #F69D50\">ActivityResultRegistry<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        : <\/span><span style=\"color: #F69D50\">DefaultLifecycleObserver<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> getContent : <\/span><span style=\"color: #F69D50\">ActivityResultLauncher<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(owner: <\/span><span style=\"color: #F69D50\">LifecycleOwner<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        getContent <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> registry.<\/span><span style=\"color: #DCBDFB\">register<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;key&quot;<\/span><span style=\"color: #ADBAC7\">, owner, <\/span><span style=\"color: #DCBDFB\">GetContent<\/span><span style=\"color: #ADBAC7\">()) { uri <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/ Handle the returned Uri<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">selectImage<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        getContent.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;image\/*&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyFragment<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Fragment<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> observer : <\/span><span style=\"color: #F69D50\">MyLifecycleObserver<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ ...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        observer <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">MyLifecycleObserver<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">requireActivity<\/span><span style=\"color: #ADBAC7\">().activityResultRegistry)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        lifecycle.<\/span><span style=\"color: #DCBDFB\">addObserver<\/span><span style=\"color: #ADBAC7\">(observer)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onViewCreated<\/span><span style=\"color: #ADBAC7\">(view: <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">, savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> selectButton <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> view.<\/span><span style=\"color: #DCBDFB\">findViewById<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Button<\/span><span style=\"color: #ADBAC7\">&gt;(R.id.select_button)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        selectButton.<\/span><span style=\"color: #DCBDFB\">setOnClickListener<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/ Open the activity to select an image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            observer.<\/span><span style=\"color: #DCBDFB\">selectImage<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ub77c\uc774\ud504 \uc0ac\uc774\ud074 \uc635\uc800\ubc84\ub97c \ub9cc\ub4e4\uace0 \uc5ec\uae30\uc5d0\uc11c registerForActivityResult()\ub300\uc2e0\uc5d0 registry.register()\ub97c \uc774\uc6a9\ud558\uc5ec \uc9c1\uc811 \ub4f1\ub85d\uc744 \ud558\uace0 \uc788\ub2e4. registry\ub294 contract\uc640 callback\uc774 \ub4f1\ub85d\ub418\ub294 \ubcc4\ub3c4\uc758 \uacf5\uac04\uc774\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. LifecycleOwner\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc81c\uac00 \ub098\uc628 \uc774\uc720\ub294 Lifecycle\uc5d0 \ub530\ub77c \uc54c\uc544\uc11c \ub4f1\ub85d\ub41c launcher\ub4e4\uc744 \uc81c\uac70\ud558\uae30 \uc704\ud568\uc774\ub2e4. \ub9cc\uc57d \uc218\ub3d9\uc73c\ub85c \uc81c\uac70\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 ActivityResultLauncher.unregister()\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\ub2e4\uace0 \ud55c\ub2e4. <\/p>\n\n\n\n<p>\uc704\uc640 \uac19\uc740 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\uc5ec \uad6c\ud604\ud558\uba74, Activity\ub098 Fragment\ub85c\ubd80\ud130 \ud574\ub2f9 \uad6c\ud604\uc744 \uc644\uc804\ud788 \ubd84\ub9ac\ud574 \ub0bc\uc218\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud655\uc2e4\ud55c \uc7a5\uc810\uc774\ub77c\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub610\ud55c, \uc720\ub2db \ud14c\uc2a4\ud2b8\uc5d0\ub3c4 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 Registry\ub300\uc2e0 test registry\ub97c \uc9c1\uc811\uad6c\ud604\ud558\uc5ec \ub123\uc5b4\uc904 \uc218 \uc788\uc5b4 \ud14c\uc2a4\ud2b8\uc5d0 \uc6a9\uc774\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c default contract\uac00 \uc544\ub2cc custom contract\uc758 \uc0ac\uc6a9\uc744 \uc54c\uc544\ubcf4\uc790. \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class PickRingtone : ActivityResultContract&lt;Int, Uri?>() {\n    override fun createIntent(context: Context, ringtoneType: Int) =\n        Intent(RingtoneManager.ACTION_RINGTONE_PICKER).apply {\n            putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, ringtoneType)\n        }\n\n    override fun parseResult(resultCode: Int, result: Intent?) : Uri? {\n        if (resultCode != Activity.RESULT_OK) {\n            return null\n        }\n        return result?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">PickRingtone<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">ActivityResultContract<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">Uri<\/span><span style=\"color: #ADBAC7\">?&gt;() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">createIntent<\/span><span style=\"color: #ADBAC7\">(context: <\/span><span style=\"color: #F69D50\">Context<\/span><span style=\"color: #ADBAC7\">, ringtoneType: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">) <\/span><span style=\"color: #F47067\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">Intent<\/span><span style=\"color: #ADBAC7\">(RingtoneManager.ACTION_RINGTONE_PICKER).<\/span><span style=\"color: #DCBDFB\">apply<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">putExtra<\/span><span style=\"color: #ADBAC7\">(RingtoneManager.EXTRA_RINGTONE_TYPE, ringtoneType)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">parseResult<\/span><span style=\"color: #ADBAC7\">(resultCode: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">, result: <\/span><span style=\"color: #F69D50\">Intent<\/span><span style=\"color: #ADBAC7\">?) : <\/span><span style=\"color: #F69D50\">Uri<\/span><span style=\"color: #ADBAC7\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (resultCode <\/span><span style=\"color: #F47067\">!=<\/span><span style=\"color: #ADBAC7\"> Activity.RESULT_OK) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> result?.<\/span><span style=\"color: #DCBDFB\">getParcelableExtra<\/span><span style=\"color: #ADBAC7\">(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>custom contract\ub97c \ub9cc\ub4e4\ub824\uba74 \uc785\ub825\uacfc \ucd9c\ub825\uac12\uc744 \uc9c0\uc815\ud574\uc918\uc57c\ud55c\ub2e4. \uc704 \uc608\uc81c\uc5d0\uc11c ActivityResultContract\ub97c \uc0c1\uc18d\ubc1b\uc73c\uba70 generic \ud0c0\uc785\uc5d0 &lt;Int, Uri?&gt;\ub97c \uc9c0\uc815\ud574\uc8fc\uace0 \uc788\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p>\ub610\ud55c \ubc14\ub514\uc5d0\uc11c\ub294 createIntent()\uc640 parseResult()\ub97c \uc624\ubc84\ub77c\uc774\ub4dc \ud574\uc11c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4. createIntent()\ub294 \ub9d0 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud560 \uc778\ud150\ud2b8\ub97c \ub9cc\ub4e4\uc5b4 \ub9ac\ud134\ud574\uc900\ub2e4. \uc608\uc804\ubc29\uc2dd\uc5d0\uc11c startActivityForResult()\uc5d0 Intent\ub97c \ub118\uaca8\uc92c\uc5c8\ub294\ub370, \uadf8\uac78 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. parseResult()\ub294 resultCode\uc640 Intent\ud615\ud0dc\uc758 result\uac00 \ub9ac\ud134\ub418\ub294\uac78 \uc54c \uc218 \uc788\ub2e4. result code\uac12\uc73c\ub85c \uc131\uacf5 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud558\uace0, \ub118\uc5b4\uc628 Intent\ub85c\ubd80\ud130 \ud544\uc694\ud55c \uac12\uc744 \ucd94\ucd9c\ud558\uace0 \uc788\ub294\uac78 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4. \uc774 \uacfc\uc815\uc744 \ubcf4\uba74, startActivityForResult()\ub97c \uc0ac\uc6a9\ud558\ub358 \ubc29\uc2dd\uc774 \uc5c6\uc5b4\uc9c4\uac8c \uc544\ub2c8\ub77c, \ucd5c\ub300\ud55c \ucd94\uc0c1\ud654 \uc2dc\ucf1c\ub193\uace0, \uae30\ubcf8\uc801\uc778 \uac83\ub4e4\uc740 default contract\ub85c \ubbf8\ub9ac \uad6c\ud604\ud574\ub1a8\uc74c\uc744 \uc774\ud574\ud560 \uac83\uc774\ub2e4. \uc704 \uc608\uc81c\uc5d0\uc11c \ubcf4\uc774\ub4ef\uc774 custom contract\ub294 Intent\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc804 \ubc29\uc2dd\uc5d0 \uc775\uc219\ud558\ub2e4\uba74 \uc190\uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ub0b4\uc6a9\uc774\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub807\uac8c custom contract\ub97c \uad6c\ud604\ud558\ub294\uac8c \uc815\uc11d\uc774\uace0 \uae54\ub054\ud558\uaca0\uc9c0\ub9cc, \uc8fc\uace0\ubc1b\ub294 \uac12\uc774 \ubcf5\uc7a1\ud558\uc9c0 \uc54a\ub2e4\uba74, StartActivityForResult contract \ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4. \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val startForResult = registerForActivityResult(StartActivityForResult()) { result: ActivityResult ->\n    if (result.resultCode == Activity.RESULT_OK) {\n        val intent = result.data\n        \/\/ Handle the Intent\n    }\n}\n\noverride fun onCreate(savedInstanceState: Bundle) {\n    \/\/ ...\n\n    val startButton = findViewById(R.id.start_button)\n\n    startButton.setOnClickListener {\n        \/\/ Use the Kotlin extension in activity-ktx\n        \/\/ passing it the Intent you want to start\n        startForResult.launch(Intent(this, ResultProducingActivity::class.java))\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> startForResult <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">registerForActivityResult<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">StartActivityForResult<\/span><span style=\"color: #ADBAC7\">()) { result: <\/span><span style=\"color: #F69D50\">ActivityResult<\/span><span style=\"color: #ADBAC7\"> -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (result.resultCode <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> Activity.RESULT_OK) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> intent <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> result.<\/span><span style=\"color: #F47067\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ Handle the Intent<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ ...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> startButton <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">findViewById<\/span><span style=\"color: #ADBAC7\">(R.id.start_button)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    startButton.<\/span><span style=\"color: #DCBDFB\">setOnClickListener<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ Use the Kotlin extension in activity-ktx<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ passing it the Intent you want to start<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        startForResult.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">Intent<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">, ResultProducingActivity::<\/span><span style=\"color: #DCBDFB\">class<\/span><span style=\"color: #ADBAC7\">.java))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>custom contract\ub97c \uc815\uc758\ud558\uc9c0 \uc54a\ub294 \ub300\uc2e0\uc5d0, launcher\uc5d0 \uc9c1\uc811 Intent\ub97c \ub118\uaca8\uc8fc\uace0, callback\uc5d0\uc11c resultCode\ud655\uc778\uacfc Intent\ub97c \uc9c1\uc811\ubc1b\ub294 \ubc29\uc2dd\uc778\ub370, \uc608\uc804\ubc29\uc2dd\uacfc \uac00\uc7a5 \uac00\uae4c\uc6b4 \ubc29\uc2dd\uc73c\ub85c \ubcf4\uc77c \uac83\uc774\ub2e4. \ub9ac\ud134\uac12\uc774 \ud544\uc694\uc5c6\uac70\ub098 \uac04\ub2e8\ud55c \uacbd\uc6b0\uc5d0 \uac00\uc7a5 \uc801\ud569\ud574 \ubcf4\uc778\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uc9c0\uae08\uae4c\uc9c0 \uc0b4\ud3b4\ubcf8 \uac83\uacfc \uac19\uc774, \uc548\ub4dc\ub85c\uc774\ub4dc \ucd08\ucc3d\uae30\ubd80\ud130 \uc0ac\uc6a9\ub418\ub358 StartActivityResult()\ub85c \uc678\ubd80 Activity\ub97c \uc2e4\ud589\ud558\ub358 \ubc29\uc2dd\uc740 deprecated\ub418\uace0 registerForActivityResult()\ub85c \ub300\uccb4\ub418\uc5c8\ub2e4. \ucda9\ubd84\ud788 \ub0a9\ub4e4\ud560\ub9cc\ud55c \ubcc0\ud654\uc774\uace0 \uc791\uc131\ud560 \ucf54\ub4dc\ub3c4 \ub354 \uae54\ub054\ud574\uc9c0\uae30 \ub54c\ubb38\uc5d0 \ub9cc\uc871\ud560 \uac83\uc774\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c Activity\uac04 \uc778\ud130\ub809\uc158\uc774 Intent\ub97c \uc774\uc6a9\ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc5d4 \ubcc0\ud568\uc774 \uc5c6\ub2e4. \uc775\uc219\ud558\ub2e4\uace0 \uc608\uc804\ubc29\uc2dd\uc5d0 \uc9d1\ucc29\ud558\uae30\ubcf4\ub2e4 \uc88b\uc740\uac70 \ube68\ub9ac \ud559\uc2b5\ud574\uc11c \uac08\uc544\ud0c0\uc790.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc \uacf5\uc2dd \ubb38\uc11c : <a href=\"https:\/\/developer.android.com\/training\/basics\/intents\/result\">https:\/\/developer.android.com\/training\/basics\/intents\/result<\/a><\/p>\n\n\n\n<p>\uc544\ub9c8\ub3c4 \uc0c8 \ubc29\uc2dd\uc774 \uc88b\uc740 \uc774\uc720? : <a href=\"https:\/\/www.mongodb.com\/developer\/article\/realm-startactivityforresult-registerForActivityResult-deprecated-android-kotlin\/\">https:\/\/www.mongodb.com\/developer\/article\/realm-startactivityforresult-registerForActivityResult-deprecated-android-kotlin\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc678\ubd80 Activity\ub97c \uc2e4\ud589\ud560 \ub54c, \uc774\uc804 \ubc29\uc2dd\uc740 startActivityForResult()\ub97c \uc774\uc6a9\ud558\uc5ec Intent\ub97c \ub0a0\ub9ac\uace0 onActivityResult() callback\uc73c\ub85c \uacb0\uacfc\ub97c \ubc1b\uc544\uc624\ub294 \ubc29\uc2dd\uc774\uc5c8\ub2e4. \uc0c8\ub86d\uac8c \uad8c\uc7a5\ud558\ub294 \ubc29\uc2dd\uc740 AndroidX \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 Activity\/Fragment \ub97c \uc774\uc6a9\ud558\uc5ec RegisterForActivityResult()\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. \uc815\ud655\ud55c \uc7a5\uc810\uc744 \uc124\uba85\ud558\uae30\uc5d0 \uc544\uc9c1 \ub0b4 \uc774\ud574\ub3c4\uac00 \ubd80\uc871\ud558\uc9c0\ub9cc, \uae30\uc874 \ubc29\uc2dd\uc774 \uc880 \ubb34\uc2dd\ud558\uae34 \ud588\ub2e4. \uc778\ud150\ud2b8\ub85c \uc678\ubd80 \uc561\ud2f0\ube44\ud2f0\ub97c \uc2e4\ud589\ud558\uace0, \ubb58 \uc2e4\ud589\ud588\ub4e0\uc9c0 onActivityResult() \ud558\ub098\uc758 \ucf5c\ubc31\uc5d0\uc11c request code\ub85c \ubd84\ub958\ud558\uba70 \uc804\ubd80 \ucc98\ub9ac\ud574\uc57c \ud588\ub2e4. \ub610\ud55c, \uc778\ud150\ud2b8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[248,247,249,186,245,244,246],"class_list":["post-977","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-activityresultcallback","tag-activityresultcontract","tag-activityresultlauncher","tag-android-2","tag-onactivityresult","tag-registerforactivityresult","tag-startactivityforresult"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=977"}],"version-history":[{"count":11,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/977\/revisions"}],"predecessor-version":[{"id":3480,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/977\/revisions\/3480"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=977"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}