{"id":556,"date":"2024-08-20T14:20:16","date_gmt":"2024-08-20T05:20:16","guid":{"rendered":"https:\/\/txn.myds.me\/blog\/?p=556"},"modified":"2024-08-20T14:20:16","modified_gmt":"2024-08-20T05:20:16","slug":"android-%e3%81%a7%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%a8%e9%80%9a%e4%bf%a1%e3%81%99%e3%82%8b-messenger%e7%b7%a8","status":"publish","type":"post","link":"https:\/\/blog.txn.red\/?p=556","title":{"rendered":"Android \u3067\u30b5\u30fc\u30d3\u30b9\u3068\u901a\u4fe1\u3059\u308b-Messenger\u7de8"},"content":{"rendered":"\n\n\n<p class=\"wp-block-paragraph\">3 \u90e8\u4f5c\u306e\u6700\u5f8c\u3067\u3059\u3001Messanger \u3092\u4f7f\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3068\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9a\u7fa9\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-Kotlin\" data-file=\"MainActivity.kt\" data-lang=\"Kotlin\" data-line=\"54-64,66-78\"><code>package red.txn.service_messenger\n\nimport android.content.ComponentName\nimport android.content.Context\nimport android.content.Intent\nimport android.content.ServiceConnection\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.IBinder\nimport android.os.Looper\nimport android.os.Message\nimport android.os.Messenger\nimport android.util.Log\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport red.txn.service_messenger.MainActivity.Companion.TAG\nimport red.txn.service_messenger.ui.theme.ServicemessengerTheme\n\n\n\nclass MainActivity : ComponentActivity() {\n    companion object {\n        const val TAG = &quot;MainActivity&quot;\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setContent {\n            ServicemessengerTheme {\n                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -&gt;\n                    Greeting(\n                        name = &quot;Android&quot;,\n                        modifier = Modifier.padding(innerPadding)\n                    )\n                }\n            }\n        }\n\n        \/\/ launch service\n        Intent(this, MessengerService::class.java).also { intent -&gt;\n            bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)\n        }\n    }\n\n    private lateinit var messenger: Messenger\n    private val serviceConnection = object : ServiceConnection {\n        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {\n            messenger = Messenger(service)\n        }\n\n        override fun onServiceDisconnected(name: ComponentName?) {\n            Log.d(TAG, &quot;onServiceDisconnected()&quot;)\n        }\n    }\n}\n\nclass MessageHandler: Handler(Looper.getMainLooper()) {\n    override fun handleMessage(msg: Message) {\n        when(msg.what) {\n            MESSAGE_FROM_SERVICE-&gt; {\n                \/\/ handle the response message\n                Log.d(TAG, &quot;received: ${msg.data.toString()}&quot;)\n            }\n            else -&gt; {\n                Log.d(TAG, &quot;received other: $msg&quot;)\n            }\n        }\n    }\n}\n\n\/\/***\n\/\/*** compsable functions\n\/\/***\n@Composable\nfun Greeting(name: String, modifier: Modifier = Modifier) {\n    Text(\n        text = &quot;Hello $name!&quot;,\n        modifier = modifier\n    )\n}\n\n@Preview(showBackground = true)\n@Composable\nfun GreetingPreview() {\n    ServicemessengerTheme {\n        Greeting(&quot;Android&quot;)\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">class Handler \u306f\u30b5\u30fc\u30d3\u30b9\u3067\u3082\u53c2\u7167\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-Kotlin\" data-file=\"MessangerService.kt\" data-lang=\"Kotlin\" data-line=\"34, 45-50\"><code>\npackage red.txn.service_messenger\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.Binder\nimport android.os.Handler\nimport android.os.IBinder\nimport android.os.Looper\nimport android.os.Message\nimport android.os.Messenger\nimport android.util.Log\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\n\n\nconst val MESSAGE_FROM_SERVICE: Int = 2\n\nclass MessengerService : Service() {\n    companion object {\n        const val TAG = &quot;MessengerService&quot;\n    }\n\n    private val messenger = Messenger(MessageHandler())\n\n\n    override fun onBind(intent: Intent): IBinder {\n        Log.d(TAG, &quot;onBind()&quot;)\n        Thread {\n            for (i in 1..2) {\n                Thread.sleep(2000)\n                sendMessageFromService()\n                Log.d(TAG, &quot;sendBroadcast: $i&quot;)\n            }\n        }.start()\n        return MyBinder()\n    }\n\n    inner class MyBinder: Binder() {\n        fun getService(): MessengerService = this@MessengerService\n    }\n\n    private fun sendMessageFromService() {\n        val message = Message.obtain()\n        message.what = MESSAGE_FROM_SERVICE\n        message.data.putString(&quot;message&quot;, &quot;Hello from MessengerService&quot;)\n        \/\/message.replyTo = messenger\n        messenger.send(message)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        Log.d(TAG, &quot;onDestroy(&quot;)\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u666e\u901a\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u5834\u5408\u3001\u666e\u901a\u306f\u53cc\u65b9\u5411\u901a\u4fe1\u306b\u4f7f\u3046\u3053\u3068\u304c\u591a\u3044\u3088\u3046\u3067\u3059\u304c\u3001message.replyTo \u304c\u7a7a\u3067\u3082\u554f\u984c\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3061\u3087\u3063\u3068\u8a66\u3057\u3066\u3044\u306a\u3044\u306e\u3067\u306a\u3093\u3068\u3082\u3044\u3048\u307e\u305b\u3093\u304c\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u3082\u3082\u3057\u304b\u3059\u308b\u3068\u3001startService() \u8d77\u52d5\u306b\u66f8\u304d\u63db\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u305d\u306e\u5834\u5408\u306f Messenger \u3092 Activity \u306b\u6e21\u3059\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3001LiveData  \u306e\u6642\u3068\u540c\u3058\u3088\u3046\u306bMessenger \u3092 companion object \u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u305d\u3046\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>3 \u90e8\u4f5c\u306e\u6700\u5f8c\u3067\u3059\u3001Messanger \u3092\u4f7f\u3063\u3066\u307f\u307e\u3059\u3002 \u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3068\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9a\u7fa9\u3067\u3059\u3002 class Handler \u306f\u30b5\u30fc\u30d3\u30b9\u3067\u3082\u53c2\u7167\u3057\u307e\u3059\u3002 \u666e\u901a\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u5834\u5408\u3001\u666e\u901a\u306f\u53cc\u65b9\u5411\u901a\u4fe1\u306b\u4f7f\u3046\u3053\u3068\u304c\u591a\u3044\u3088\u3046\u3067\u3059\u304c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":9,"footnotes":""},"categories":[9],"tags":[4],"class_list":["post-556","post","type-post","status-publish","format-standard","hentry","category-dev","tag-android"],"_links":{"self":[{"href":"https:\/\/blog.txn.red\/index.php?rest_route=\/wp\/v2\/posts\/556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.txn.red\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.txn.red\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.txn.red\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.txn.red\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=556"}],"version-history":[{"count":0,"href":"https:\/\/blog.txn.red\/index.php?rest_route=\/wp\/v2\/posts\/556\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.txn.red\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.txn.red\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.txn.red\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}