2021/05/29

[android] Service (7) - bindしてみよう (4)

今回で同一プロセスでの 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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。