{"id":1431,"date":"2019-08-09T16:09:03","date_gmt":"2019-08-09T07:09:03","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=1431"},"modified":"2019-08-09T16:09:03","modified_gmt":"2019-08-09T07:09:03","slug":"%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c-%ec%84%9c%eb%b9%84%ec%8a%a4-%ec%8b%ac%ec%b8%b5-%eb%b6%84%ec%84%9d","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=1431","title":{"rendered":"\uc548\ub4dc\ub85c\uc774\ub4dc \uc11c\ube44\uc2a4 \uc2ec\uce35 \ubd84\uc11d"},"content":{"rendered":"<p>\uc6d0\ubb38 :\u00a0https:\/\/proandroiddev.com\/deep-dive-into-android-services-4830b8c9a09<\/p>\n<hr \/>\n<h2>\uc548\ub4dc\ub85c\uc774\ub4dc Service\ub85c \ube60\uc838 \ubd05\uc2dc\ub2e4<\/h2>\n<h2>\uc18c\uac1c<\/h2>\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc885\uc885 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2e4\ud589\uc774 \ud544\uc694\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud574\uc57c\ud569\ub2c8\ub2e4. \uc774\ub7f4\uacbd\uc6b0 \uba54\uc778\uc4f0\ub808\ub4dc\uac00 \uc544\ub2cc \uc11c\ube0c\uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \uc608\uae30\uce58 \uc54a\uc740 \uacb0\uacfc\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c\ub4e4\uc5b4 \uc11c\ube0c\uc4f0\ub808\ub4dc\ub97c \uc218\ud589\ud55c \ub4a4 \uc561\ud2f0\ube44\ud2f0 \ud654\uba74 \ud68c\uc804 \ub4f1\uc73c\ub85c \uc778\ud574 onDestroy()\uac00 \ud638\ucd9c\ub418\uace0,\u00a0 \uc11c\ube0c \uc4f0\ub808\ub4dc\uc758 \uc791\uc5c5\uc774 \ub05d\ub0ac\uc744 \ub54c \ud574\ub2f9 Activity\ub294 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uc0c1\ud0dc\ub77c\uba74 UI\uac31\uc2e0\uc744 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7f4 \ub54c \ud544\uc694\ud55c \uc548\ub4dc\ub85c\uc774\ub4dc\uc758 \ucef4\ud3ec\ub10c\ud2b8\ub294 \ubc14\ub85c Service \uc785\ub2c8\ub2e4.<\/p>\n<p>\uc11c\ube44\uc2a4\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uad6c\uc131\uc694\uc18c\uc911 \ud558\ub098\ub85c \uba54\uc778\uc4f0\ub808\ub4dc\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 UI\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.\u00a0 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 AndroidManifest.xml\uc5d0 \ud574\ub2f9 \uc11c\ube44\uc2a4\ub97c \uc120\uc5b8\ud574\uc57c\ud569\ub2c8\ub2e4.\u00a0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc4f0\ub808\ub4dc\ub294 \uac1c\ubc1c\uc790\uac00 \uc9c1\uc811\uad00\ub9ac\ud574\uc57c\ud569\ub2c8\ub2e4.\u00a0 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc640 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub77c\ub294 \uc6a9\uc5b4\uac00 \ub9ce\uc774 \ub098\uc624\ubbc0\ub85c\u00a0\ub2e4\uc74c\uc758 \ub450\uac00\uc9c0\ub85c \ub098\ub204\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc548\ub4dc\ub85c\uc774\ub4dc \ucef4\ud3ec\ub10c\ud2b8 \uc0dd\uba85\uc8fc\uae30<\/li>\n<li>\uc4f0\ub808\ub4dc<\/li>\n<\/ul>\n<p>\uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \ucef4\ud3ec\ub10c\ud2b8 \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30 \ud560\ub54c <strong>\ubc31\uadf8\ub77c\uc6b4\ub4dc<\/strong>\uc640 <strong>\ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc<\/strong>\ub77c\ub294 \uc6a9\uc5b4\ub97c \uc0ac\uc6a9\ud558\uace0, \uc4f0\ub808\ub4dc\ub97c \ucc38\uc870\ud560 \ub54c\ub294 <strong>\ubc31\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc<\/strong>\uc640 <strong>\ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc<\/strong>\ub77c\ub294 \uc6a9\uc5b4\ub97c \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc11c\ube44\uc2a4 \uc790\uc2e0\uc758 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc\ub97c \ub2e4\ub8e8\ub294 \uc11c\ube0c\ud074\ub798\uc2a4\uac00 \uc788\ub294\ub370 \ubc14\ub85c IntentService\ub77c\ub294 \ub140\uc11d\uc785\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\ub8e8\uc9c0 \uc54a\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc4f0\ub808\ub4dc, \uc11c\ube44\uc2a4, \uc548\ub4dc\ub85c\uc774\ub4dc \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30<\/h2>\n<p>\ud55c \uac78\uc74c \ub4a4\ub85c \ubb3c\ub7ec\uc11c\uc11c \uc11c\ube44\uc2a4\uac00 \uc5b4\ub5a4 \uc758\ubbf8\uc788\ub294 \uc77c\ub4e4\uc744 \ud558\ub294\uc9c0 \ub354 \ud070 \uadf8\ub9bc\uc744 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\uc790\uac00 \uc9e0 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc\uc5d0\uc11c \ub3cc\uc544\uac00\ub294\u00a0 \uc790\ubc14 \uc4f0\ub808\ub4dc \ub610\ub294 Executor \uc640 \uac19\uc740 \uac83\ub4e4\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc \ucef4\ud3ec\ub10c\ud2b8 \uc0dd\uba85\uc8fc\uae30\uc640 \ud06c\uac8c \ubb36\uc774\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc561\ud2f0\ube44\ud2f0\uad00\uc810\uc5d0\uc11c \ubd24\uc744 \ub54c \ubcc4\uac1c\uc758 \uc2dc\uc791\uc810\uacfc \uc885\ub8cc\uc810\uc744 \uac00\uc9c0\uace0 \uc788\uace0,\u00a0 \uc774\uac83\uc740 \uc0ac\uc6a9\uc790\uc640\uc758 \uc0c1\ud638\uc791\uc6a9\uc5d0 \uadfc\uac04\ud569\ub2c8\ub2e4. \uc5b4\uca0c\uac70\ub098 \uc774\ub7ec\ud55c \uc2dc\uc791\uc810\uacfc \uc885\ub8cc\uc810\uc740 \uc4f0\ub808\ub4dc\uc758 \uc0dd\uba85\uc8fc\uae30\uc640\ub294 \ubc18\ub4dc\uc2dc \uc5f0\uacb0\ub420 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<img decoding=\"async\" loading=\"lazy\" class=\"pa pb gn n o gm ab gj\" width=\"700\" height=\"436\" src=\"https:\/\/miro.medium.com\/max\/1400\/0*H-wMrc-xKAoFENhM.\" \/><\/p>\n<p>\uc55e\uc758 \uadf8\ub9bc\uc740 \uc561\ud2f0\ube44\ud2f0\uc640 \uc11c\ube44\uc2a4\uc5d0 \uad00\ud55c \uc720\uc758\uc0ac\ud56d\uc744 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \ud45c\ud604\ud588\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub4e0 \ud3ec\uc778\ud2b8\uc5d0 \ub300\ud55c \uc138\ubd80\uc124\uba85\uc740 \ub4b7\ubd80\ubd84\uc5d0\uc11c \uc124\uba85\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc11c\ube44\uc2a4\uc758 onCreate() \uba54\uc18c\ub4dc\ub294 \uc11c\ube44\uc2a4\uac00 \uc2dc\uc791\ub418\uac70\ub098 \ubc14\uc778\ub529\ub418\ub824\uace0 \uc0dd\uc131\ub420 \ub54c \ud638\ucd9c\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc11c\ube44\uc2a4\ub294 \uc0dd\uc131\ub41c \ub4a4 \uc4f0\ub808\ub4dc \ub610\ub294 \uc775\uc2dc\ud050\ud130\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc4f0\ub808\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c \uc11c\ube44\uc2a4\uc5d0\uac8c \uc885\ub8cc\ub97c \uc54c\ub9ac\uace0 \uc2f6\ub2e4\uba74\u00a0 stopSelf()\ub97c \uc11c\ube44\uc2a4\ub0b4\ubd80\uc5d0\uc11c \ud638\ucd9c\ud558\uba74\ub429\ub2c8\ub2e4.\u00a0<\/li>\n<\/ul>\n<p>\uc4f0\ub808\ub4dc \ub610\ub294 \uc775\uc2dc\ud050\ud130\uc5d0 \uc791\uc131\ud55c \ucf54\ub4dc\ub294 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc2dc\uc791\ub418\uc5c8\ub294\uc9c0 \uc885\ub8cc\ub418\uc5c8\ub294\uc9c0 \uc5ec\ubd80\ub97c \uc11c\ube44\uc2a4\uc5d0\uac8c \uc54c\ub824\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc4f0\ub808\ub4dc\uac00 \uc2dc\uc791\ub418\uba74 \uc11c\ube44\uc2a4\uc758 \uc2dc\uc791\uc0c1\ud0dc\ub97c \uc124\uc815\ud574\uc57c\ud55c\ub2e4<\/li>\n<li>\uadf8\ub9ac\uace0 \uc2a4\ub808\ub4dc\uac00 \uba48\ucd94\uba74 stopSelf()\ub97c \ud638\ucd9c\ud574\uc57c\ub9cc \ud55c\ub2e4.<\/li>\n<\/ul>\n<p>\uc11c\ube44\uc2a4\uc758 onDestroy() \uba54\uc18c\ub4dc\ub294 \uc11c\ube44\uc2a4\uac00 \uc885\ub8cc\ud560 \uc2dc\uc810\uc744 \uac1c\ubc1c\uc790\uac00 \uc54c\ub824\uc92c\uc744\ub54c \uc548\ub4dc\ub85c\uc774\ub4dc \uc2dc\uc2a4\ud15c\uc5d0 \uc758\ud574\uc11c\ub9cc \ud638\ucd9c \ub429\ub2c8\ub2e4. \uc11c\ube44\uc2a4 \uc785\uc7a5\uc5d0\uc11c\ub294 \uc4f0\ub808\ub4dc\ub098 \uc775\uc2dc\ud050\ud130 \uc791\uc5c5\uc774 \ud604\uc7ac \uc218\ud589\uc911\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ubbc0\ub85c \uc11c\ube44\uc2a4\uac00 \uc5b8\uc81c \uc2dc\uc791\ub418\uace0 \uc5b8\uc81c \ub05d\ub098\uc57c\ud558\ub294\uc9c0 \uc54c\uac8c \ud558\ub294\uac83\uc740 \uac1c\ubc1c\uc790\uc758 \ucc45\uc784\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub450\uac00\uc9c0 \uc885\ub958\uc758 \uc11c\ube44\uc2a4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc2dc\uc791\ub418\ub294 \uc11c\ube44\uc2a4\uc640 \ubc14\uc6b4\ub529 \ub418\ub294\uc11c\ube44\uc2a4 \uc785\ub2c8\ub2e4.<br \/>\n\uadf8\ub9ac\uace0 \uc11c\ube44\uc2a4\ub294 \ub3d9\uc2dc\uc5d0 \ub458\ub2e4 \ub420\uc218\ub3c4\uc788\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc138\uac00\uc9c0 \uc885\ub958\uc758 \uc11c\ube44\uc2a4\uc758 \ud589\ub3d9\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4<\/p>\n<ul>\n<li>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4<\/li>\n<li>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4<\/li>\n<li>\ubc14\uc6b4\ub4dc \uadf8\ub9ac\uace0 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4<\/li>\n<\/ul>\n<h2>Android O\uc758 \ubcc0\uacbd<\/h2>\n<p>Oreo\uc5d0\uc11c \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc758 \ub9ce\uc740 \ubd80\ubd84\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc8fc\uc694 \ubcc0\ud654 \uc0ac\ud56d\uc911 \ud558\ub098\uac00 \uc561\ud2f0\ube44\ud2f0\uac00 \uc0ac\ub77c\uc84c\uc744 \ub54c \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0 \uc788\ub294 \uc11c\ube44\uc2a4\uac00 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc(persistent notification)\uc744 \uac00\uc9c8\uc218 \uc5c6\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ubc18\ub4dc\uc2dc \uc774\ub7ec\ud55c \uc54c\ub9bc\uc774 \ud544\uc694\ud558\ub2e4\uba74 startForegroundService() \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud574\uc57c\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 5\ucd08\uc774\ub0b4\uc5d0 startForeground()\ub97c \ud638\ucd9c\ud558\uc5ec \uc11c\ube44\uc2a4\ub97c \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c \ubcc0\uacbd\ud558\uc9c0 \uc54a\ub294 \ub2e4\uba74 ANR\uc774 \ubc1c\uc0dd\ub418\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h2>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4<\/h2>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub294 startService(Intent)\uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 \uc2dc\uc791\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc778\ud150\ud2b8\ub294 \uc9c1\uc811\ub9cc\ub4e0 \uc11c\ube44\uc2a4 \ud074\ub798\uc2a4\ub97c \ucc38\uc870\ud558\uac70\ub098 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud328\ud0a4\uc9c0 \uc774\ub984\uc744 \ud3ec\ud568\ud558\ub294 \uba85\uc2dc\uc801 \uc778\ud150\ud2b8\uc5ec\uc57c\ub9cc \ud569\ub2c8\ub2e4. \ub2e4\uc74c \uc544\ub798\uc758 \uba85\uc2dc\uc801 \uc778\ud150\ud2b8\ub97c \uc0dd\uc131\ud558\ub294 \ucf54\ub4dc\ub97c \ud655\uc778\ud574\ubcf4\uc138\uc694.<\/p>\n<pre class=\"lang:java decode:true \">public class MyIntentBuilder{\r\n    public static MyIntentBuilder getInstance(Context context) {\r\n        return new MyIntentBuilder(context);\r\n    }\r\n \r\n    public MyIntentBuilder(Context context) {\r\n        this.mContext = context;\r\n    }\r\n \r\n    public MyIntentBuilder setMessage(String message) {\r\n        this.mMessage = message;\r\n        return this;\r\n    }\r\n \r\n    public MyIntentBuilder setCommand(@Command int command) {\r\n        this.mCommandId = command;\r\n        return this;\r\n    }\r\n \r\n    public Intent build() {\r\n        Assert.assertNotNull(\"Context can not be null!\", mContext);\r\n        Intent intent = new Intent(mContext, MyTileService.class);\r\n        if (mCommandId != Command.INVALID) {\r\n            intent.putExtra(KEY_COMMAND, mCommandId);\r\n        }\r\n        if (mMessage != null) {\r\n            intent.putExtra(KEY_MESSAGE, mMessage);\r\n        }\r\n        return intent;\r\n    }\r\n \r\n}<\/pre>\n<p>\uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\ub41c \uc0c1\ud0dc\ub85c \uc62e\uae30\uae30 \uc704\ud574 \ubc18\ub4dc\uc2dc \uba85\uc2dc\uc801 \uc778\ud150\ud2b8\uc640 \ud568\uaed8 startService()\ub97c \ud638\ucd9c\ud574\uc57c\ud55c\ub2e4. \ub9cc\uc57d \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uc11c\ube44\uc2a4\ub294 \uc2dc\uc791\ub418\uc9c0 \uc54a\ub294\ub2e4. \uc11c\ube44\uc2a4\uac00 \uc2dc\uc791\ub41c \uc0c1\ud0dc\uac00 \uc544\ub2c8\ub77c\uba74 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c \uc62e\uae38\uc218\ub3c4 \uc5c6\uace0 stopSelf()\ub3c4 \ub3d9\uc791 \ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p>\ub9cc\uc57d \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\ub41c \uc0c1\ud0dc\ub85c \ub193\uc9c0 \uc54a\uc73c\uba74 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc \ub610\ud55c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \uac1c\ubc1c\uc790\uac00 \uc11c\ube44\uc2a4\ub97c \uc5b8\uc81c \uc2dc\uc791\uc0c1\ud0dc\uc5d0 \ub450\uc5b4\uc57c\ud558\ub294 \uc9c0 \uc54c \ub54c \uace0\ub824\ud574\uc57c\ud560 \uc911\uc694\ud55c \uc0ac\ud56d\uc774\ub2e4.<\/p>\n<p>\uc11c\ube44\uc2a4\ub294 \uc5ec\ub7ec\ubc88 \uc2e4\ud589\ub420\uc218 \uc788\ub2e4. \uc2dc\uc791\ub420 \ub54c\ub9c8\ub2e4 onStartCommand()\uac00 \ud638\ucd9c \ub41c\ub2e4. \uba85\uc2dc\uc801 \uc778\ud150\ud2b8\uc5d0 \ud3ec\ud568\ub41c \uc5d1\uc2a4\ud2b8\ub77c\uac00 \ud30c\ub77c\ubbf8\ud130\uac00 \ub418\uc5b4 \uc774 \uba54\uc18c\ub4dc\ub85c \ub118\uaca8\uc9c0\uac8c \ub41c\ub2e4. \ube44\ub85d \uc11c\ube44\uc2a4\uac00 \uc5ec\ub7ec\ubc88 \uc2dc\uc791 \ub420 \uc218 \uc788\uc9c0\ub9cc, onCreate()\ub294 \ub2e8 \ud55c\ubc88\ub9cc \ud638\ucd9c\ub41c\ub2e4. \ubc14\uc778\ub529\ub41c \uc11c\ube44\uc2a4 \uc77c\ub54c\uc5d0\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\ub2e4.\u00a0 \uc11c\ube44\uc2a4\ub97c \uc8fd\uc774\uae30 \uc704\ud574\uc11c\ub294 \uc11c\ube44\uc2a4\ub0b4\ubd80\uc5d0\uc11c stopSelf()\ub97c \ud638\ucd9c\ud574\uc57c\ub41c\ub2e4. \uc11c\ube44\uc2a4\uac00 \uba48\ucd94\uace0 \uc544\ubb34\uac83\ub3c4 \ubc14\uc778\ub41c\uac83\uc774 \uc5c6\uc744 \ub54c onDestroy()\uac00 \ud638\ucd9c\ub41c\ub2e4. \uba85\uc2ec\ud574\uc57c\ud560\uac83\uc740 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub97c \uc704\ud574 \uc2dc\uc2a4\ud15c \uc790\uc6d0\uc774 \ud560\ub2f9 \ub41c\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n<h2>\uc778\ud150\ud2b8<\/h2>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub294 \uc778\ud150\ud2b8\uc640 \ud568\uaed8 \uc2e4\ud589\ub418\ub294\ub370, \uc11c\ube44\uc2a4\ub97c \uc2e4\ud589\uc2dc\ud0a4\ub294 \ucef4\ud3ec\ub10c\ud2b8\uac00 \uc11c\ube44\uc2a4\uc640 \uc5f0\uacb0\ub418\uc9c0 \uc54a\ub294 \uc0c1\ud0dc\uc5d0\uc11c \ud6c4\uc5d0 \uc11c\ube44\uc2a4\uc640 \ud1b5\uc2e0\uc744 \uc704\ud574 \uc5f0\uacb0\uc744 \ud558\uace0 \uc2f6\ub2e4\uba74 \ub2e4\ub978 \uc778\ud150\ud2b8\ub97c \uc0dd\uc131\ud558\uc5ec \ub2e4\uc2dc \uc2dc\uc791\ud560\uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc740 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc640 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc758 \uc8fc\uc694 \ucc28\uc774\uc810\uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub294 client-server \ud328\ud134\uc744 \ub2e4\ub974\ub294\ub370, \uc774\ub54c \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc5ed\ud560\uc740\u00a0 UI\ub97c \ub2f4\ub2f9\ud558\ub294 \uc561\ud2f0\ube44\ud2f0\ub098 \ub610\ub294 \uc11c\ube44\uc2a4\uac00 \ub418\uc5b4 stub \ub610\ub294 binder\ub97c \uc720\uc9c0\ud558\uace0 \uc11c\ubc84\uc5ed\ud560\uc744 \ub2f4\ub2f9\ud558\ub294 \uc5f0\uacb0\ub41c \uc11c\ube44\uc2a4\uc758 \uba54\uc18c\ub4dc\ub97c \uc9c1\uc811\uc801\uc73c\ub85c \ud638\ucd9c\ud558\uac8c \ub41c\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    @TargetApi(Build.VERSION_CODES.O)\r\n    private void moveToStartedState() {\r\n        Intent intent = new MyIntentBuilder(this)\r\n            .setCommand(Command.START).build();\r\n        if (isPreAndroidO()) {\r\n            Log.d(TAG, \"Running on Android N or lower\");\r\n            startService(intent);\r\n        } else {\r\n            Log.d(TAG, \"Running on Android O\");\r\n            startForegroundService(intent);\r\n        }\r\n    }\r\n}<\/pre>\n<p>\uc870\uc2ec\ud574\uc57c\ud560\uac83\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc O\uc5d0\uc11c\uc758 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc774\ub2e4. \ub354\uc774\uc0c1 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\uc744 \uac16\ub294 \uac83\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\ud558\uae30 \uc704\ud574 startForegroundService(Intent)\ub97c \uc2e4\ud589\ud574\uc57c\ud55c\ub2e4.<\/p>\n<h2>\ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc \uc640 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\u00a0<\/h2>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub294 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub3d9\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \ub9d0\ud574 \uc11c\ube44\uc2a4\uac00 \uba54\uc778\uc2a4\ub808\ub4dc\uc5d0\uc11c \ub3cc\uc544\uac00\ub358\uc9c0 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2a4\ub808\ub4dc\uc5d0\uc11c \ub3cc\uc544\uac00\ub358\uc9c0 \uc55e\uc11c \ub9d0\ud55c <strong>\ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc<\/strong>\ub77c\ub294 \uc6a9\uc5b4\uac00 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\u00a0 \uc774\uac8c \ubb34\uc2a8 \ub73b\uc774\ub0d0\uba74 \uc548\ub4dc\ub85c\uc774\ub4dc \uc2dc\uc2a4\ud15c\uc740 \ub0ae\uc740 \uc2dc\uc2a4\ud15c \ub9ac\uc18c\uc2a4 \ud658\uacbd\uc5d0\uc11c\ub3c4 \uc11c\ube44\uc2a4\uc5d0\uac8c \uc6b0\uc120\uc21c\uc704\ub97c \ub192\uac8c \uc8fc\uace0, \uc885\ub8cc(Destroy)\ub418\uc9c0 \uc54a\ub3c4\ub85d \ub178\ub825 \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub294 \uc544\uc8fc \uc911\uc694\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud560 \ub54c \uc0ac\uc6a9\uc790\ub97c \uc2e4\ub9dd\uc2dc\ud0a4\uc9c0 \ub9d0\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc740\uacfc \uac19\uc740 \uc720\uc988\ucf00\uc774\uc2a4\uc5d0 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub179\ud654 \ub610\ub294 \ube44\ub514\uc624\/\uc74c\uc545\uc744 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc7ac\uc0dd\ud574\uc57c\ud55c\ub2e4<\/li>\n<li>\uc9c0\ub3c4\/\ub124\ube44\uac8c\uc774\uc158 \uc571\uacfc \uac19\uc774 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc704\uce58\ub97c \uce21\uc815\ud574\uc57c\ud560 \ub54c<\/li>\n<\/ol>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub97c \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c \uc62e\uae38 \ub54c \ubc18\ub4dc\uc2dc \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\uc744 \ub098\ud0c0\ub0b4\uc57c \ud558\uace0, \uba85\ubc31\ud558\uac8c \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc11c\ube44\uc2a4\uac00 \ub3d9\uc791\ud558\uace0 \uc788\uc74c\uc744 \uc54c\ub824\uc57c\ud569\ub2c8\ub2e4. \uc774\uac8c \uc911\uc694\ud55c \uc774\uc720\ub294 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub294 \ub354 \uc774\uc0c1 UI\ucef4\ud3ec\ub10c\ud2b8\uac00 \ud654\uba74\uc5d0 \ub098\ud0c0\ub098\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc0ac\uc6a9\uc790\uc758 \ud578\ub4dc\ud3f0\uc5d0\uc11c \uc5b4\ub5a4\uc791\uc5c5\uc744 \uc218\ud589\ud558\uace0 \uc788\ub294\uc9c0 \uc720\uc838\ub294 \uc54c\uae38\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc774\ubd80\ubd84\uc740 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc0ac\ud56d\uc774\uba70, \ud654\uba74\uc5d0 \ub098\ud0c0\ub0b4\uc9c0 \uc54a\ub294 \ub2e4\uba74 \uc7a0\uc7ac\uc801\uc73c\ub85c \ubc30\ud130\ub9ac\ub97c \uac09\uc544\uba39\uc5b4\uc11c \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc88b\uc740 \uacbd\ud5d8\uc744 \uc8fc\uc9c0 \ubabb\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c\uc758 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc758 \uc608\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    private void commandStart() {\r\n \r\n        if (!mServiceIsStarted) {\r\n            moveToStartedState();\r\n            return;\r\n        }\r\n \r\n        if (mExecutor == null) {\r\n            \/\/ Start Executor task in Background Thread.\r\n        } \r\n    }\r\n}<\/pre>\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc O \uc774\uc804\uc774\ub77c\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\uc744 \ud45c\ud604\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">@TargetApi(25)\r\n    public static class PreO {\r\n \r\n        public static void createNotification(Service context) {\r\n            \/\/ Create Pending Intents.\r\n            PendingIntent piLaunchMainActivity = \r\n                getLaunchActivityPI(context);\r\n            PendingIntent piStopService = getStopServicePI(context);\r\n \r\n            \/\/ Action to stop the service.\r\n            NotificationCompat.Action stopAction =\r\n                new NotificationCompat.Action.Builder(\r\n                    STOP_ACTION_ICON,\r\n                    getNotificationStopActionText(context),\r\n                    piStopService)\r\n                    .build();\r\n \r\n            \/\/ Create a notification.\r\n            Notification mNotification =\r\n                new NotificationCompat.Builder(context)\r\n                    .setContentTitle(getNotificationTitle(context))\r\n                    .setContentText(getNotificationContent(context))\r\n                    .setSmallIcon(SMALL_ICON)\r\n                    .setContentIntent(piLaunchMainActivity)\r\n                    .addAction(stopAction)\r\n                    .setStyle(new NotificationCompat.BigTextStyle())\r\n                    .build();\r\n \r\n            context.startForeground(\r\n                ONGOING_NOTIFICATION_ID, mNotification);\r\n        }\r\n    }<\/pre>\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc O\uc5d0\uc11c\ub294 \uc54c\ub9bc \ucc44\ub110\uacfc \ud568\uaed8 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\uc744 \ud654\uba74\uc5d0 \ub098\ud0c0\ub0c5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@TargetApi(26)\r\n    public static class O {\r\n \r\n        public static final String CHANNEL_ID = \r\n            String.valueOf(getRandomNumber());\r\n \r\n        public static void createNotification(Service context) {\r\n            String channelId = createChannel(context);\r\n            Notification notification = \r\n                buildNotification(context, channelId);\r\n            context.startForeground(\r\n                ONGOING_NOTIFICATION_ID, notification);\r\n        }\r\n \r\n        private static Notification buildNotification(\r\n            Service context, String channelId) {\r\n            \/\/ Create Pending Intents.\r\n            PendingIntent piLaunchMainActivity = \r\n                getLaunchActivityPI(context);\r\n            PendingIntent piStopService = \r\n                getStopServicePI(context);\r\n \r\n            \/\/ Action to stop the service.\r\n            Notification.Action stopAction = \r\n                new Notification.Action.Builder(\r\n                    STOP_ACTION_ICON,\r\n                    getNotificationStopActionText(context),\r\n                    piStopService)\r\n                    .build();\r\n \r\n            \/\/ Create a notification.\r\n            return new Notification.Builder(context, channelId)\r\n                    .setContentTitle(getNotificationTitle(context))\r\n                    .setContentText(getNotificationContent(context))\r\n                    .setSmallIcon(SMALL_ICON)\r\n                    .setContentIntent(piLaunchMainActivity)\r\n                    .setActions(stopAction)\r\n                    .setStyle(new Notification.BigTextStyle())\r\n                    .build();\r\n        }\r\n \r\n        @NonNull\r\n        private static String createChannel(Service ctx) {\r\n            \/\/ Create a channel.\r\n            NotificationManager notificationManager =\r\n                (NotificationManager) \r\n                ctx.getSystemService(Context.NOTIFICATION_SERVICE);\r\n            CharSequence channelName = \"Playback channel\";\r\n            int importance = NotificationManager.IMPORTANCE_DEFAULT;\r\n            NotificationChannel notificationChannel =\r\n                new NotificationChannel(\r\n                    CHANNEL_ID, channelName, importance);\r\n            \r\n            notificationManager.createNotificationChannel(\r\n                 notificationChannel);\r\n            return CHANNEL_ID;\r\n        }\r\n    }<\/pre>\n<p>\ub610\ud55c MediaStyle \uc54c\ub9bc\uc5d0 \ub300\ud55c \ub354 \uc790\uc138\ud55c \uc815\ubcf4\ub294 \uc544\ub798\uc758 \uae00\uc5d0\uc11c \uc0b4\ud3b4\ubcf4\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. (\uc624\ub514\uc624 \ubc31\uadf8\ub77c\uc6b4\ub4dc \ud50c\ub808\uc774\ubc31\uc740 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4, \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4 \ubaa8\ub450\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.)<\/p>\n<p>https:\/\/medium.com\/androiddevelopers\/migrating-mediastyle-notifications-to-support-android-o-29c7edeca9b7<\/p>\n<h2>Stopping Started Services<\/h2>\n<p>\uc54c\ub9bc\uc5d0\uac8c \uc8fc\uc5b4\uc9c4 PendingIntent\uc5d0\uc11c \uc11c\ube44\uc2a4\ub97c \uba48\ucd94\uace0 \uc2f6\uc744 \uc218 \uc788\ub2e4. \uadf8\ub7f4\ub550 startService(Intent)\ub97c \ud638\ucd9c\ud560 \ub54c Intent\uc5d0\uac8c \uc801\ub2f9\ud55c \uc778\uc790\ub97c \ub118\uaca8\uc11c onStartCommand()\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public class HandleNotifications{\r\n    private static PendingIntent getStopServicePI(Service context) {\r\n        PendingIntent piStopService;\r\n        {\r\n            Intent iStopService = new MyIntentBuilder(context)\r\n                .setCommand(Command.STOP).build();\r\n            piStopService = PendingIntent.getService(\r\n                context, getRandomNumber(), iStopService, 0);\r\n        }\r\n        return piStopService;\r\n    }\r\n}<\/pre>\n<pre class=\"lang:java decode:true \">ublic class MyService extends Service{\r\n    @Override\r\n    public int onStartCommand(Intent intent, int flags, int startId) {\r\n        boolean containsCommand = MyIntentBuilder\r\n            .containsCommand(intent);\r\n        d(TAG,\r\n          String.format(\r\n              \"Service in [%s] state. cmdId: [%d]. startId: [%d]\",\r\n              mServiceIsStarted ? \"STARTED\" : \"NOT STARTED\",\r\n              containsCommand ? \r\n                  MyIntentBuilder.getCommand(intent) : \"N\/A\",\r\n              startId));\r\n        mServiceIsStarted = true;\r\n        routeIntentToCommand(intent);\r\n        return START_NOT_STICKY;\r\n    }\r\n \r\n    private void routeIntentToCommand(Intent intent) {\r\n        if (intent != null) {\r\n \r\n            \/\/ process command\r\n            if (containsCommand(intent)) {\r\n                processCommand(MyIntentBuilder.getCommand(intent));\r\n            }\r\n \r\n            \/\/ process message\r\n            if (MyIntentBuilder.containsMessage(intent)) {\r\n                processMessage(MyIntentBuilder.getMessage(intent));\r\n            }\r\n        }\r\n    }\r\n \r\n}<\/pre>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub97c \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c\ubd80\ud130 \ub0b4\ub9ac\uace0 \uc2f6\ub2e4\uba74 stopForeground(true)\ub97c \ud638\ucd9c\ud55c\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc9c0\uc18d\uc801\uc778 \uc54c\ub9bc\ub3c4 \ub0b4\ub824\uac08 \uac83\uc774\ub2e4. \ud558\uc9c0\ub9cc \uc11c\ube44\uc2a4\ub97c \uc911\uc9c0 \ud558\uc9c0\ub294 \uc54a\ub294\ub2e4. \uc11c\ube44\uc2a4\ub294 stopSelf() \ub4f1\uc744 \ud638\ucd9c\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\uc11c\ube44\uc2a4\ub97c \uc911\uc9c0\ud558\uae30 \uc704\ud574 \ub2e4\uc74c\uc744 \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n<ol>\n<li>\uc55e\uc11c \uc0b4\ud3b4\ubcf8 \ucf54\ub4dc\uc640 \uac19\uc774, \uc778\ud150\ud2b8\uc758 \uc5d1\uc2a4\ud2b8\ub77c\ub85c startService()\ub97c \ud638\ucd9c\ud560\ub9cc\ud55c \uc778\uc790\ub97c \ub118\uae30\uba74 onStartCommand()\uc5d0\uc11c \uc774\ub97c \uc218\ud589\ud560 \uac83\uc774\uace0, \uc11c\ube44\uc2a4\ub0b4\uc5d0\uc11c \uacb0\uad6d stopSelf()\ub97c \ud638\ucd9c\ud558\uc5ec \uc11c\ube44\uc2a4\ub97c \uc885\ub8cc\ud558\uac8c \ub41c\ub2e4. \ub9cc\uc57d \uc5f0\uacb0\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8(\uc561\ud2f0\ube44\ud2f0 \ub4f1)\uc774 \uc5c6\ub2e4\uba74 onDestroy()\uac00 \ud638\ucd9c\ub420 \uac83\uc774\uace0 \uc11c\ube44\uc2a4\ub294 \uc885\ub8cc\ub418\uac8c \ub41c\ub2e4.<\/li>\n<li>\uc11c\ube44\uc2a4\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \uba85\uc2dc\uc801 \uc778\ud150\ud2b8\ub97c \ub9cc\ub4e4\uace0 \uc774\ub97c stopService(Intent)\uc5d0\uac8c \ub118\uaca8 stopSelf()\uac00 \ud638\ucd9c\ub418\uac8c \ub418\ub3c4\ub85d \ub9cc\ub4e4\uc5b4 \uc11c\ube44\uc2a4\ub97c \uc885\ub8cc\uc2dc\ud0ac \uc218\ub3c4 \uc788\ub2e4.<\/li>\n<\/ol>\n<p>\uc561\ud2f0\ube44\ud2f0\ub85c \ubd80\ud130 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub97c \uc885\ub8cc\ud558\ub294 \uc0d8\ud50c \ucf54\ub4dc\uc774\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    void stopService1(){\r\n        stopService(new MyIntentBuilder(this).build());\r\n    }\r\n    void stopService2(){\r\n        startService(new MyIntentBuilder(this)\r\n            .setCommand(Command.STOP).build());\r\n    }\r\n}<\/pre>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\ub0b4\uc5d0\uc11c \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c\ubd80\ud130 \ub0b4\ub9ac\uace0 \uc885\ub8cc\ud558\ub294 \uac83\uc744 \uac00\uc815\ud55c\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class MyService extends Service{\r\n    private void stopCommand(){\r\n        stopForeground(true);\r\n        stopSelf();\r\n    }\r\n}<\/pre>\n<h2>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4<\/h2>\n<p>\uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc640\ub294 \ub2ec\ub9ac \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \ucef4\ud3ec\ub10c\ud2b8 \uc0ac\uc774\uc5d0\uc11c \uc11c\ube44\uc2a4\uc640 \uc5f0\uacb0\uc744 \uc124\uc815\ud558\uac8c \ub41c\ub2e4. \uc774 \uc5f0\uacb0\uc740 IBinder \ub77c\uace0 \ubd80\ub974\ub294 \uc11c\ube44\uc2a4\uc758 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uac8c \ud574\uc8fc\ub294 \ub140\uc11d\uc73c\ub85c \ubd80\ud130 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \uc11c\ube44\uc2a4\ub97c \ubc14\uc778\ub529\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \uc608\uc81c\ub294 \ub85c\uceec \ud504\ub85c\uc138\uc2a4(\ud558\ub098\uc758 \uc571) \ub0b4\uc5d0\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8\ub97c \uac16\ub294 \uac83\uc774\ub2e4. \uc774 \uacbd\uc6b0\uc5d0\ub294 \uc790\ubc14 \uac1d\uccb4(Binder\uc758 \uc11c\ube0c\ud074\ub798\uc2a4)\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \ub178\ucd9c\ub418\uc5b4\uc9c0\uac8c \ub418\uace0 \uc11c\ube44\uc2a4\uc758 public \uba54\uc18c\ub4dc\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uac8c \ub41c\ub2e4.<\/p>\n<p>\uc880\ub354 \ubcf5\uc7a1\ud55c \uc2dc\ub098\ub9ac\uc624\ub294 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uac00 \uc11c\ub85c\ub2e4\ub978 \ud074\ub77c\uc774\uc5b8\ud2b8 \ud504\ub85c\uc138\uc2a4\uc758\ub85c\ubd80\ud130 \uc5f0\uacb0\ub418\ub294 \uac83\uc774\ub2e4. Message \ud578\ub4e4\ub7ec \ub610\ub294 AIDL \ucf54\ub4dc\uac00 \uc788\uc5b4\uc57c\ud55c\ub2e4. \uc5b4\uca0c\uac70\ub098 \ub85c\uceec \ud504\ub85c\uc138\uc2a4\ub0b4\uc5d0\uc11c\uc758 \ubc14\uc778\ub529\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud558\ub2e4.<\/p>\n<p>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc640 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc758 \ucc28\uc774\uc810 \ubaa9\ub85d\uc744 \ud655\uc778\ud558\uc790<\/p>\n<ul>\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub294 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc5d0\uac8c \uc5f0\uacb0\uc744 \uac16\uc9c0 \uc54a\ub294\ub2e4. \uc774\uac83\uc740 \uadf8\uc800 \uc778\ud150\ud2b8\ub97c \uc218\ud589\ud560 \ub54c startService() \ub610\ub294 stopService()\ub97c \uc218\ud589\ud558\uc5ec \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uc758 onStartCommand()\ub97c \uc218\ud589\ud558\uba74 \ub41c\ub2e4.<\/li>\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8( \uc561\ud2f0\ube44\ud2f0, \ud504\ub808\uadf8\uba3c\ud2b8 \ub610\ub294 \ub2e4\ub978 \uc11c\ube44\uc2a4)\uac00 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc5d0 \uc5f0\uacb0\ud558\uc5ec \uc11c\ube44\uc2a4\uc758 \uba54\uc18c\ub4dc \ud638\ucd9c\uc744 \uc6d0\ud560\ub54c\uc5d0\ub294 IBinder \uac1d\uccb4\uac00 \ud544\uc694\ud558\ub2e4.<\/li>\n<\/ul>\n<p>\uc5b4\ub5a0\ud55c \uacbd\uc6b0\uac04\uc5d0 \ud558\ub098\uc758 \ud504\ub85c\uc138\uc2a4\ub0b4\uc5d0\uc11c \uc11c\ube44\uc2a4\uac00 \uc5f0\uacb0\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8 \ub610\ub294 \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\ud55c \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0bc \ud544\uc694\uac00 \uc788\ub2e4\uba74 LocalBroadcastManager\uc640 \uac19\uc740 \uc5b4\ub5a4 \ubb34\uc5b8\uac00\uac00 \ud544\uc694\ud558\ub2e4.\u00a0 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub4e4\uc740 \ubcf4\ud1b5\uc740 \ub2e4\ub978 \ucef4\ud3ec\ub10c\ud2b8\uc5d0 \uc9c1\uc811 \uc5f0\uacb0 \ud558\uc9c0\ub294 \uc54a\ub294 \ud3b8\uc774\ub2e4.<\/p>\n<h2>bindService() \uadf8\ub9ac\uace0 onCreate()<\/h2>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc11c\ube44\uc2a4\uc5d0 \uc5f0\uacb0\ud558\uae30 \uc704\ud574 \uba85\uc2dc\uc801\uc778\ud150\ud2b8\uc640 \ud568\uaed8\u00a0 bindService()\ub97c \ubc18\ub4dc\uc2dc \ud638\ucd9c\ud574\uc57c\ud55c\ub2e4. \uc0d8\ud50c \ucf54\ub4dc\ub97c \ubcf4\uc790.<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    void bind(){\r\n        bindService(\r\n                new MyIntentBuilder(this).build(),\r\n                mServiceConnection,\r\n                BIND_AUTO_CREATE);\r\n    }\r\n}<\/pre>\n<p>bindService()\ub97c \ud638\ucd9c\ud560 \ub54c \uc778\uc790\ub85c \ub123\ub294 BIND_AUTO_CREATE\ub294 \ub9e4\uc6b0 \uc77c\ubc18\uc801\uc778 \ud50c\ub808\uadf8\uc774\ub2e4. (\ub2e4\ub978 \ud50c\ub808\uadf8\ub3c4 \ubb3c\ub860 \uc874\uc7ac\ud55c\ub2e4) \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131(auto create)\ub2e4\ub294 \uac83\uc740 \uc5f0\uacb0\ub41c \uc11c\ube44\uc2a4\uac00\u00a0 \uc5c6\ub2e4\uba74 bindService()\ub97c \ud638\ucd9c\ud558\uba74\uc11c onCreate()\ub97c \ud638\ucd9c\ud558\uaca0\ub2e4\ub294\uac83\uc774\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c\ub294 \uccab\ubc88\uc9f8 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc5f0\uacb0\ub420\ub54c \uc790\ub3d9\uc801\uc73c\ub85c \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uac00 \uc0dd\uc131\uc774 \ub41c\ub2e4.<\/p>\n<p>\uc77c\ub2e8 bindService()\uac00 \ud638\ucd9c\ub418\uace0 \ub098\uba74 \uc11c\ube44\uc2a4\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \ubb34\uc5b8\uac00 \ubc18\uc751\uc744 \ubcf4\uc77c \ubc29\ubc95\uc774 \ud544\uc694\ud558\ub2e4 \uadf8\ub9ac\uace0 IBinder \uac1d\uccb4\uc5d0\uac8c \uc774\uc81c \uc11c\ube44\uc2a4\uc758 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud560 \uc218 \uc788\uc74c\uc744 \uc54c\ub9b0\ub2e4. \uc774\ub7ec\ud55c \uc77c\ub4e4\uc740 ServiceConnection\uc5d0 \uc758\ud574 \uc77c\uc5b4\ub09c\ub2e4. \ubc14\uc6b4\ub4dc\uc11c\ube44\uc2a4\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c \uc5f0\uacb0\uacfc\uc815\uc774 \ub05d\ub0ac\uc74c\uc744 \uc54c\ub9ac\uae30 \uc704\ud574 ServiceConnection\u00a0 \ucf5c\ubc31\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc758 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c0\ub354\ub77c\ub3c4 \uc774\ub97c \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc54c \uc218 \uc788\uac8c \ub41c\ub2e4.<\/p>\n<p>ServiceConnection \uad6c\ud604 \uc608\uc81c\ub97c \ubcf4\uc790.<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    private ServiceConnection mServiceConnection = \r\n        new ServiceConnection(){\r\n            public void onServiceConnected(\r\n                ComponentName cName, IBinder service){\r\n                    MyBinder binder = (MyService.MyBinder) service;\r\n                    mService = binder.getService(); \r\n                    \/\/ Get a reference to the Bound Service object.\r\n                    mServiceBound = true;\r\n        }\r\n        public void onServiceDisconnected(ComponentName cName){\r\n            mServiceBound= false;\r\n        }\r\n    };\r\n}<\/pre>\n<h2>\uc11c\ube44\uc2a4 \ubc14\uc778\ub354<\/h2>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 bindService(Intent)\ub97c \ud638\ucd9c\ud588\uc744\ub54c \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4 \uce21\uba74\uc5d0\uc11c \uc5b4\ub5a4 \uc77c\ub4e4\uc774 \uc77c\uc5b4\ub098\ub294\uc9c0 \ud568\uaed8 \ubcf4\uc790.<\/p>\n<p>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc5d0\uc11c \uac1c\ubc1c\uc790\ub294 onBindg()\uba54\uc18c\ub4dc\ub97c \uad6c\ud604\ud574\uc57c\ud558\ub9cc \ud55c\ub2e4. \uc774\uac83\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\uac8c \uc5f0\uacb0\ub418\ub294 \uccab\ubc88\uc9f8 \uc21c\uac04\uc5d0 \ub531 \ud55c\ubc88\ub9cc \ud638\ucd9c\ub420 \uac83\uc774\ub2e4.<\/p>\n<p>\uc0d8\ud50c \ucf54\ub4dc\ub97c \ubcf4\uc790.<\/p>\n<pre class=\"lang:java decode:true \">public class MyService extends Service{\r\n    public IBinder onBind(Intent intent){\r\n        if (mBinder == null){\r\n            mBinder = new MyBinder();\r\n        }\r\n        return mBinder;\r\n    }\r\n}<\/pre>\n<p>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub294 IBinder\ud0c0\uc785\uc758 mBinder\uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<p>\uadf8\ub798\uc11c IBinder\uac00 \ubb34\uc5c7\uc774\ub780 \ub9d0\uc778\uac00?<\/p>\n<p>Binder\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \uae30\ubc18\uc758 \ud074\ub798\uc2a4\ub85c \uc6d0\uaca9 \uac1d\uccb4\uc758 \uc0dd\uc131\uc744 \ud5c8\uc6a9\ud574\uc900\ub2e4. \uac00\ubcbc\uc6b4 RPC \uba54\ucee4\ub2c8\uc998\uc758 \uad6c\ud604\uc73c\ub85c \ub192\uc740 \ud37c\ud3ec\uba3c\uc2a4\uc640 \uad50\ucc28 \ud504\ub85c\uc138\uc2a4\uac04, \uc989 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uac04\uc758 \uba54\uc18c\ub4dc call\uc744 \uad6c\ud604\ud55c\ub2e4.<\/p>\n<p>\uc608\uc81c\ub97c \ud655\uc778\ud558\uc790.<\/p>\n<pre class=\"lang:java decode:true \">public class MyService extends Service{\r\n    public class MyBinder extends android.os.Binder {\r\n        MyService getService(){\r\n             \/\/ Simply return a reference to this instance \r\n             \/\/of the Service.            \r\n             return MyService.this; \r\n        }\r\n    }\r\n}<\/pre>\n<p>\uc55e\uc120 \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uba74 \uc6b0\ub9ac\ub294 \uac04\ub2e8\ud558\uac8c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c getService()\uba54\uc18c\ub4dc\ub97c \ub178\ucd9c\uc2dc\ucf30\ub2e4. IBinder\uc758 \ucc38\uc870\uc640 \ud568\uaed8 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc774\uc81c \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4 \uac1d\uccb4\uc5d0 \uc9c1\uc811\uc801\uc73c\ub85c \uc811\uadfc\ud558\uc5ec public \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c \ud560 \uc218 \uc788\uac8c \ub418\uc5c8\ub2e4. \uc54c\uc544\ub46c\uc57c \ud560 \uac83\uc740 \uba54\uc18c\ub4dc\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc4f0\ub808\ub4dc\ub85c \uc2e4\ud589\ub41c\ub2e4\ub294 \uac83\uc774\ub2e4. \uc561\ud2f0\ube44\ud2f0 \ub610\ub294 \ud504\ub808\uadf8\uba3c\ud2b8\uc758 \uacbd\uc6b0 \uc774 \uba54\uc18c\ub4dc\ub294 \uba54\uc778\uc2a4\ub808\ub4dc\uc5d0\uc11c \ub3d9\uc791\ud558\ub2c8 \ubc14\uc6b4\ub4dc\uc11c\ube44\uc2a4\uc5d0\uc11c \ube14\ub77d\ud0b9 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc870\uc2ec\ud574\uc57c\ud55c\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 ANR\ub97c \ub9db\ubcf4\uac8c \ub41c\ub2e4.<\/p>\n<h1 id=\"c4b8\" class=\"mh mi ee ap ao ca mj mk ml mm mn mo mp mq mr ms mt\" data-selectable-paragraph=\"\">\uc5f0\uacb0\ud574\uc81c\uc640 onDestroy<\/h1>\n<p>\ubc14\uc6b4\ub4dc\uc11c\ube44\uc2a4\ub85c\ubd80\ud130 \uc5f0\uacb0\uc744 \ud574\uc81c\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud788 unBindService(ServiceConnection)\uc744 \ud638\ucd9c \ud560 \uc218 \uc788\ub2e4. \uc2dc\uc2a4\ud15c\uc740 onUnbind()\uba54\uc18c\ub4dc\ub97c \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub0b4\uc5d0\uc11c \ud638\ucd9c\ud558\uac8c \ub420\uac83\uc774\ub2e4. \ub9cc\uc57d \uc5f0\uacb0\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc5c6\ub2e4\uba74 \uc11c\ube44\uc2a4\uac00 \uc2dc\uc791\uc0c1\ud0dc\uc77c\uc9c0\ub77c\ub3c4 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub0b4\uc5d0\uc11c onDestroy()\uac00 \ud638\ucd9c\ub41c\ub2e4. \uc11c\ube44\uc2a4\uac00 \uc2dc\uc791\ub41c \uc0c1\ud0dc\uac00 \uc544\ub2c8\ub77c\ub3c4 onDestroy()\uac00 \uc989\uc2dc \ud638\ucd9c\ub418\uace0 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\ub294 \uc8fd\uac8c \ub41c\ub2e4.<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uc11c unbindService()\ub97c \ud638\ucd9c\ud558\ub294 \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uc790<\/p>\n<pre class=\"lang:java decode:true \">public class MyActivity extends Activity{\r\n    protected void onStop(){\r\n        if (mServiceBound){\r\n            unbindService(mServiceConnection);\r\n            mServiceBound = false;\r\n        }\r\n    }\r\n}<\/pre>\n<p>\uc55e\uc758 \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74 \uc561\ud2f0\ube44\ud2f0\uc758 onStop()\uba54\uc18c\ub4dc\ub294 unbindService()\ub97c \ud638\ucd9c\ud558\uae30 \uc704\ud574 \uc7ac\uc815\uc758 \ub418\uc5c8\ub2e4. \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc774 \uc911\uc694\uc2dc \ub418\ub294 \uc571\uc774\ub77c\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub294 bind(\uc5f0\uacb0) \uadf8\ub9ac\uace0 unbind(\uc5f0\uacb0\ud574\uc81c)\ub97c onStart() \ub610\ub294 onStop()\uc5d0\uc11c \ud560 \uc218 \uc788\ub2e4. \ub610\ub294 \ub2e4\ub978 \uc548\ub4dc\ub85c\uc774\ub4dc \uc561\ud2f0\ube44\ud2f0, \ud504\ub808\uadf8\uba3c\ud2b8, \uc11c\ube44\uc2a4\uc758 \uc0dd\uba85\uc8fc\uae30 \uba54\uc18c\ub4dc\ub0b4\uc5d0\uc11c \ud638\ucd9c\ud574\ub3c4 \uc0c1\uad00\uc5c6\ub2e4.<\/p>\n<p>onUnbind() \ub300\ud55c \uc608\uc81c\uc774\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class MyService extends Service{\r\n    public boolean onUnbind(Intent i){\r\n        return false;\r\n    }\r\n}<\/pre>\n<p>\uc804\ud615\uc801\uc73c\ub85c false\ub97c \ubc18\ud658\ud55c\ub2e4. \ub9cc\uc57d \uadf8\ub807\uc9c0 \uc54a\ub2e4\uba74 \ub2e4\uc74c \ud074\ub7ec\uc774\uc5b8\ud2b8\uac00 \uc5f0\uacb0\ud560\ub54c onBind()\ub300\uc2e0 onRebind()\uac00 \ud638\ucd9c\ub41c\ub2e4.<\/p>\n<h2>\ubc14\uc6b4\ub4dc \uadf8\ub9ac\uace0 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4<\/h2>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc11c\ube44\uc2a4\ub97c \uc694\ud558\ub294 \ub9ce\uc740 \uc6a9\ub840\uac00 \uc874\uc7ac\ud55c\ub2e4. \uc55e\uc758 \ub0b4\uc6a9\ub4e4\uc5d0\uc11c \ub9ce\uc740 \uc138\ubd80\ub0b4\uc6a9\uc744 \uc5b8\uae09\ud588\uc9c0\ub9cc \uadf8\uac83\ub4e4\uc740 \ubcf4\ud1b5 \uc0dd\uc131\uacfc \uc18c\uba78\uc5d0 \ub300\ud55c \ub0b4\uc6a9\ub9cc \ud3ec\ud568\ud588\ub2e4.<\/p>\n<p>\ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc640 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4 \ubaa8\ub450 \uba54\uc18c\ub4dc\ub97c \uac00\uc9c8 \uc218 \uc788\uace0, \uc774\ub97c \uc5f0\uacb0\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c\ubd80\ud130 \ud638\ucd9c\ub420 \uc218 \uc788\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ube44\uc2a4\uc5d0 \ubc14\uc778\ub529\ud558\uae30 \uc704\ud574 \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ubbc0\ub85c \ubc18\ub4dc\uc2dc \uc54c\uc544\uc57c\ud55c\ub2e4. \uc774\ub294 \uc11c\ube44\uc2a4\uc5d0 \ubc14\uc778\ub529 \ub41c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 onCreatre()\ub97c \ud638\ucd9c\ud568\uc744 \uc758\ubbf8\ud55c\ub2e4. \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791\uc0c1\ud0dc\ub85c \uc62e\uae30\uc9c0 \uc54a\uc73c\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ube44\uc2a4\uc5d0\uc11c \ubc14\uc778\ub529\uc744 \ud574\uc81c\ud558\uba74\uc11c \uc11c\ube44\uc2a4\uac00 \uc885\ub8cc\ub418\uace0 onDestro() \uba54\uc18c\ub4dc\uac00 \ud638\ucd9c\ub41c\ub2e4.<\/p>\n<p><span>UI \ucef4\ud3ec\ub10c\ud2b8\uac00 \uc11c\ube44\uc2a4\uc5d0 \ubc14\uc778\ub4dc\ub418\uc5b4 \uc791\uc131\ub418\ub294 \uc0c1\ud669\uc77c \ub54c \uc5b4,\ub290 \uc2dc\uc810\uc5d0\uc11c UI\uac00 \uc11c\ube44\uc2a4\uc5d0\uc11c \ubc14\uc778\ub529 \ud574\uc81c\ub418\uace0, \uc624\ub798 \uc2e4\ud589\ub418\ub294 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \uc911\uc774\uba74 onDestroy()\uac00 \ud638\ucd9c\ub418\uc5b4 \uc885\ub8cc\ub429\ub2c8\ub2e4. \uc571 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub530\ub77c \ubc14\uc778\ub4dc \uc11c\ube44\uc2a4\uac00 UI \uad6c\uc131 \uc694\uc18c\uc758 \uc0dd\uba85\uc8fc\uae30 \uc885\ub8cc \uc774\ud6c4\uc5d0\ub3c4 \uacc4\uc18d \uc2e4\ud589\ub418\uc5b4\uc57c\ud558\ub294 \uacbd\uc6b0 \uc2dc\uc791\ud558\uace0 \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc\ub85c \uc774\ub3d9\ud558\uc5ec \uc9c0\uc18d\uc801\uc73c\ub85c \uc54c\ub9bc\uc744 \ud45c\uc2dc\ud574\uc57c\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c\ud558\uba74 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4\uc640 \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uac00 \ud544\uc694\ud55c \ub3d9\uc548 \ub610\ub294 \uc0ac\uc6a9\uc790\uac00 \uc11c\ube44\uc2a4\ub97c \uc911\uc9c0\ud558\uae30 \uc704\ud574 PendingIntent\ub97c \uc2e4\ud589\ud558\uc5ec \uc11c\ube44\uc2a4\ub97c \uc885\ub8cc\ud558\uae30\ub85c \uacb0\uc815\ud560 \ub54c\uae4c\uc9c0 \uacc4\uc18d \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uc2dc\uc791\uc0c1\ud0dc\ub85c \uc62e\uae30\uae30<\/h2>\n<p><span>\uc11c\ube44\uc2a4\uc5d0 \ubc14\uc778\ub529 \ub41c \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc11c\ube44\uc2a4\ub97c \uc2dc\uc791 \uc0c1\ud0dc\ub85c \uc774\ub3d9\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \ubc14\uc6b4\ub4dc \ubc0f \uc2dc\uc791 \uc11c\ube44\uc2a4\uc758 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc11c\ube44\uc2a4 \uc790\uccb4\ub97c \uc2dc\uc791 \uc0c1\ud0dc\ub85c \uc62e\uae30\ub294 \uac83\uc774 \uc548\uc804\ud569\ub2c8\ub2e4.<\/span><\/p>\n<pre class=\"lang:java decode:true\">public class MyService extends Service{\r\n \r\n    private void commandStart() {\r\n \r\n        if (!mServiceIsStarted) {\r\n            moveToStartedState();\r\n            return;\r\n        }\r\n \r\n        if (mExecutor == null) {\r\n            mTimeRunning_sec = 0;\r\n \r\n            if (isPreAndroidO()) {\r\n                HandleNotifications.PreO.createNotification(this);\r\n            } else {\r\n                HandleNotifications.O.createNotification(this);\r\n            }\r\n \r\n            mExecutor = Executors\r\n               .newSingleThreadScheduledExecutor();\r\n            Runnable runnable =\r\n                    new Runnable() {\r\n                        @Override\r\n                        public void run() {\r\n                            recurringTask();\r\n                        }\r\n                    };\r\n            mExecutor.scheduleWithFixedDelay(\r\n                runnable, DELAY_INITIAL, \r\n                DELAY_RECURRING, DELAY_UNIT);\r\n            d(TAG, \"commandStart: starting executor\");\r\n        } else {\r\n            d(TAG, \"commandStart: do nothing\");\r\n        }\r\n    }\r\n \r\n    @TargetApi(Build.VERSION_CODES.O)\r\n    private void moveToStartedState() {\r\n \r\n        Intent intent = new MyIntentBuilder(this)\r\n          .setCommand(Command.START).build();\r\n        if (isPreAndroidO()) {\r\n            Log.d(TAG, \"moveToStartedState: on N\/lower\");\r\n            startService(intent);\r\n        } else {\r\n            Log.d(TAG, \"moveToStartedState: on O\");\r\n            startForegroundService(intent);\r\n        }\r\n    }\r\n \r\n    @Override\r\n    public int onStartCommand(\r\n        Intent intent, int flags, int startId) {\r\n        boolean containsCommand = MyIntentBuilder\r\n            .containsCommand(intent);\r\n        d(TAG,\r\n            String.format(\r\n            \"Service in [%s] state. id: [%d]. startId: [%d]\",\r\n            mServiceIsStarted ? \"STARTED\" : \"NOT STARTED\",\r\n            containsCommand ? \r\n                MyIntentBuilder.getCommand(intent) : \"N\/A\",\r\n            startId));\r\n        mServiceIsStarted = true;\r\n        routeIntentToCommand(intent);\r\n        return START_NOT_STICKY;\r\n    }\r\n \r\n}<\/pre>\n<p>\uc55e\uc758 \uc608\uc81c\uc5d0\uc11c\u00a0<\/p>\n<ol>\n<li>commandStart()\ub294 \uc11c\ube44\uc2a4\uc5d0 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc5f0\uacb0\ub420 \ub54c \ud638\ucd9c\ub41c\ub2e4.<\/li>\n<li>\ub610\ub294 \uc778\ud150\ud2b8\ub97c \ud1b5\ud574 startService() \ub610\ub294 startServiceInForeground()(\uc548\ub4dc\ub85c\uc774\ub4dc O \uc774\uc0c1\uc5d0\uc11c)\uc5d0 \uc758\ud574 \ud638\ucd9c \ub41c\ub2e4.<\/li>\n<\/ol>\n<p>\uc608\uc81c\uc5d0\uc11c \ubcf4\uc5ec\uc8fc\ub294 \uac83\uc740 \uc2e4\uc81c\ub85c \uc775\uc2dc\ud050\ud130\ub97c \ub9cc\ub4e4\uae30 \uc804\uc5d0 \uc11c\ube44\uc2a4\uac00 \uc2dc\uc791\ub41c \uc0c1\ud0dc\uc5d0 \ub193\uc774\ub294 \uac83\uc785\ub2c8\ub2e4.\u00a0<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\uac00 \uc11c\ube44\uc2a4\uc5d0 \uc5f0\uacb0\ub41c \ud6c4 commandStart()\uac00 \ud638\ucd9c\ub42c\ub2e4\uace0 \uac00\uc815\ud588\uc744 \ub54c , \uc11c\ube44\uc2a4\ub294 \uc544\uc9c1 \uc2dc\uc791 \ub418\uc9c0 \uc54a\uc558\ub2e4.<\/p>\n<ol>\n<li>\ub9cc\uc57d \uc11c\ube44\uc2a4\uac00 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc5f0\uacb0\ub41c\ub2e4\uba74, \uc2dc\uc791\ub418\uc9c0 \uc54a\uc740\uac83\uc774\ub2e4 \uadf8\ub9ac\uace0 mServiceStarted\ub294 false\uc774\ub2e4.<\/li>\n<li><span>\uc774 \uacbd\uc6b0 moveToStarted () \uc0c1\ud0dc\uc5d0 \ub300\ud55c \ud638\ucd9c\uc740 \ub2e8\uc21c\ud788 Extra (Command.START)\ub97c \uc0ac\uc6a9\ud558\uc5ec \uba85\uc2dc\uc801 Intent\ub97c \uc791\uc131\ud558\uace0 startService () \ub610\ub294 startForegroundService ()\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4.<\/span><\/li>\n<li>\uc774\uac83\uc740 \ub9c8\uce68\ub0b4 onStartCommand()\ub97c \ud638\ucd9c\ud558\uac8c \ub418\uace0 caommandStart()\ub97c \ub2e4\uc2dc \uac00\ub974\ud0a4\uac8c \ub429\ub2c8\ub2e4.<\/li>\n<li>\uc5b4\uca0c\uac70\ub098 \uc774\ub54c commandStart() mServiceIsStarted\ub294 true\ub85c \ubcc0\uacbd\ub418\uace0 \uc774\uac83\uc740 \uc0ac\uc2e4\uc0c1 commandStart()\ub97c\uc218\ud589\ud558\uc5ec Executor\ub97c \uc0dd\uc131\ud558\uac8c \ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h2>\uc18c\uba78 \uadf8\ub9ac\uace0 \uc5f0\uacb0\ud574\uc81c(Destruction and unbinding)<\/h2>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\uac00 \uc11c\ube44\uc2a4\ub85c \ubd80\ud130 \uc5f0\uacb0\uc774 \ud574\uc81c\uac00 \ub420\ub54c \ub9cc\uc57d \uc2dc\uc791\uc0c1\ud0dc\uac00 \uc544\ub2c8\ub77c\uba74 \uc11c\ube44\uc2a4\uc5d0\uc11c onDestroy()\uac00 \ud638\ucd9c\ub420 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \uc2dc\uc791\uc0c1\ud0dc\ub77c\uba74 \uc11c\ube44\uc2a4\uac00 \uc8fd\uc9c4 \uc54a\uc2b5\ub2c8\ub2e4. \uc2dc\uc791\ub41c \uc11c\ube44\uc2a4\uac00 \uba48\ucd94\uc5b4\uc57c\ub9cc \uc885\ub8cc\ub418\uac8c \ub429\ub2c8\ub2e4. ( stopService(Intent) \ub610\ub294 \uc778\ud150\ud2b8\uc5d0 \uc885\ub8cc\uba54\uc2dc\uc9c0\uac00 \ud3ec\ud568\ub41c startService(Intent)\ub97c \ud638\ucd9c\ud588\uc744 \ub54c )<\/p>\n<p>\uc5ec\uae30 \uc5f0\uacb0\ub41c \uc11c\ube44\uc2a4\uc640 \ubc14\uc6b4\ub4dc \uc11c\ube44\uc2a4 \uc0ac\uc774\uc758 \uc774\ub7ec\ud55c \uc0c1\ud0dc\uc640 \uc804\ud658\uc5d0 \ub300\ud574 \uc694\uc57d\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"pb pc gn n o gm ab gj\" width=\"1480\" height=\"1496\" src=\"https:\/\/miro.medium.com\/max\/1480\/1*UZk5VDWt6UaF6K6Y9IbaDg.png\" \/><\/p>\n<p>\uc18c\uc2a4\ucf54\ub4dc \uc608\uc81c<\/p>\n<p>\uc774 \uc608\uc81c\uc5d0\uc11c \uc0b4\ud3b4\ubcf8 Awake App\uc5d0 \ub300\ud55c \uc18c\uc2a4\ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcfc\uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac04\ub2e8\ud55c \uc720\ud2f8\ub9ac\ud2f0 \uc571\uc73c\ub85c Android O \uc640 N\uc5d0 \ub300\ud574 \ucda9\uc804\ud558\ub294 \ub3d9\uc548 \ud654\uba74\uc774 \ucf1c\uc838\uc788\uc744\uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\uc774 \ud3ec\ud568\ub418\uc5b4\uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul class=\"\">\n<li id=\"332a\" class=\"lo lp ee ap lq b lr ls lt lu lv lw lx ly lz ma mb nr nd ne\" data-selectable-paragraph=\"\"><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.r3bl.stayawake&amp;rdid=com.r3bl.stayawake\" class=\"dd bt md me mf mg\">Awake Android App on Google Play Store<\/a><\/li>\n<li id=\"7878\" class=\"lo lp ee ap lq b lr nf lt ng lv nh lx ni lz nj mb nr nd ne\" data-selectable-paragraph=\"\"><a href=\"https:\/\/github.com\/r3bl-alliance\/stay-awake-app\" class=\"dd bt md me mf mg\">Source code for Awake app on GitHub<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\uc6d0\ubb38 :\u00a0https:\/\/proandroiddev.com\/deep-dive-into-android-services-4830b8c9a09 \uc548\ub4dc\ub85c\uc774\ub4dc Service\ub85c \ube60\uc838 \ubd05\uc2dc\ub2e4 \uc18c\uac1c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc885\uc885 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2e4\ud589\uc774 \ud544\uc694\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud574\uc57c\ud569\ub2c8\ub2e4. \uc774\ub7f4\uacbd\uc6b0 \uba54\uc778\uc4f0\ub808\ub4dc\uac00 \uc544\ub2cc \uc11c\ube0c\uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc608\uae30\uce58 \uc54a\uc740 \uacb0\uacfc\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c\ub4e4\uc5b4 \uc11c\ube0c\uc4f0\ub808\ub4dc\ub97c \uc218\ud589\ud55c \ub4a4 \uc561\ud2f0\ube44\ud2f0 \ud654\uba74 \ud68c\uc804 \ub4f1\uc73c\ub85c \uc778\ud574 onDestroy()\uac00 \ud638\ucd9c\ub418\uace0,\u00a0 \uc11c\ube0c \uc4f0\ub808\ub4dc\uc758 \uc791\uc5c5\uc774 \ub05d\ub0ac\uc744 \ub54c \ud574\ub2f9 Activity\ub294 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uc0c1\ud0dc\ub77c\uba74 UI\uac31\uc2e0\uc744 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[16],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1431"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1431"}],"version-history":[{"count":1,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1431\/revisions"}],"predecessor-version":[{"id":1432,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1431\/revisions\/1432"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}