今回で同一プロセスでの 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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。