今回で同一プロセスでの bindシリーズを終わらせたい。
まず、動かす。
これはサンプルコードそのままやればよい。
ファイルを追加しながらやるよりも、AndroidStudioの Service追加を使う方がよいだろう。AndroidManifest.xml に <service> を追加してくれるからだ。まあ、これは初心者ならではか。exported設定は、今回は同一プロセスのみにするのでfalseでよいだろう。
AndroidManifest.xml (追加行)
01: ... 02: <service 03: android:name=".MyService" 04: android:enabled="true" 05: android:exported="false"></service> 06: ...
MyActivity.kt (importなどは省略)
01: class MainActivity : AppCompatActivity() { 02: private val logTag: String = "MainActivity" 03: private lateinit var mService: MyService 04: private var mBound: Boolean = false 05: 06: private val mServiceConnection = object : ServiceConnection { 07: override fun onServiceConnected(className: ComponentName, service: IBinder) { 08: Log.d(logTag, "onServiceConnected") 09: val binder = service as MyService.MyBinder 10: mService = binder.getService() 11: mBound = true 12: } 13: 14: override fun onServiceDisconnected(p0: ComponentName?) { 15: Log.d(logTag, "onServiceDisconnected") 16: mBound = false 17: } 18: } 19: 20: override fun onCreate(savedInstanceState: Bundle?) { 21: Log.d(logTag, "onCreate") 22: super.onCreate(savedInstanceState) 23: setContentView(R.layout.activity_main) 24: 25: intent = Intent(this, MyService::class.java) 26: // startService(intent) 27: bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE) 28: } 29: 30: override fun onStop() { 31: Log.d(logTag, "onStop") 32: super.onStop() 33: if (mBound) { 34: unbindService(mServiceConnection) 35: mBound = false 36: } 37: } 38: }
MyService.kt (importなどは省略)
01: class MyService : Service() { 02: private val logTag: String = "MyService" 03: 04: private val mBinder = MyBinder() 05: 06: inner class MyBinder: Binder() { 07: fun getService(): MyService = this@MyService 08: } 09: 10: override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 11: Log.d(logTag, "onStartCommand") 12: return super.onStartCommand(intent, flags, startId) 13: } 14: 15: override fun onBind(intent: Intent): IBinder { 16: Log.d(logTag, "onBind") 17: return mBinder 18: } 19: 20: override fun onCreate() { 21: Log.d(logTag, "onCreate") 22: super.onCreate() 23: } 24: 25: override fun onDestroy() { 26: Log.d(logTag, "onDestroy") 27: super.onDestroy() 28: } 29: }
これでビルドできたのでエミュレータにインストールして起動させると logcatが出た。
D/MainActivity: onCreate
D/MyService: onCreate
D/MyService: onBind
D/MainActivity: onServiceConnected
bindService()を呼んで Serviceが作られて、 onBindでインスタンスを返すという順番だ。
アプリを閉じる(Home画面を表示)とすぐに onDestroyのログも出た。時間も載せよう。
2021-05-29 15:59:35.365 D/MainActivity: onStop
2021-05-29 15:59:35.400 D/MyService: onDestroy
onSuspend()など実装していないので細かいのは分からんが、onStop()ってこんなにすぐ呼ばれるものなの? bindせずに startService()だけした場合には1分で onDestroyのログが出ていたので、bindしている=アプリとの結びつきが強くなる=アプリの onDestroy()に引っ張られる、ということかしらね。
startService()に変更して試してみよう。
D/MainActivity: onCreate
D/MyService: onCreate
D/MyService: onStartCommand
Home画面にする。
2021-05-29 16:00:41.858 D/MainActivity: onStop
2021-05-29 16:01:41.854 D/MyService: onDestroy
ほら、約1分。
不思議だねぇ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。