前回に引き続き、Android OSのServiceについてだ。
うちのサイトは「技術日記」なので、学習としては向いていないと思う。
その代わり、正しくなかったことも書いているはず。
まあ、ネットで調べながらだとそういうことも少なくなってしまうが。
で、Serviceだ。
AndroidStudioでMyServiceというサービスを組み込んでみたのだが、その状態でアプリを起動させてもサービスが立ち上がった気配がない。気配というのは、overrideできる関数を全部オーバーライドしてLogを埋め込んだもののlogcatに何も出力されなかったからだ。
というわけで、ServiceはActivityからの起動が必要となる。
「別のアプリ コンポーネントがサービスを開始でき」と書いてあるので、別にActivityから起動させる必要はないのだが、知らないサービスを起動させることはできないだろうから、まあだいたいはServiceとセットになったActivityから起動させるのが妥当だろう。
01: package com.example.sample0
02:
03: import android.content.Intent
04: import android.os.Bundle
05: import androidx.appcompat.app.AppCompatActivity
06:
07: class MainActivity : AppCompatActivity() {
08: override fun onCreate(savedInstanceState: Bundle?) {
09: super.onCreate(savedInstanceState)
10: setContentView(R.layout.activity_main)
11:
12: intent = Intent(this, MyService::class.java)
13: startService(intent)
14: }
15: }
Kotlinだとnewは不要なのは知っていたのだが、intentの書き方が分からんかった。
「インテントとインテントフィルタ」に書いてあったしエラーにならなかったので、これでよいのだろう。
MyService.ktはオーバーライドできそうな関数にログを埋め込んだだけ。
01: class MyService : Service() {
02: private val logTag: String = "MyService"
03:
04: override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
05: Log.d(logTag, "onStartCommand")
06: return super.onStartCommand(intent, flags, startId)
07: }
08:
09: override fun onBind(intent: Intent): IBinder {
10: Log.d(logTag, "onBind")
11: TODO("Return the communication channel to the service.")
12: }
13:
14: override fun onCreate() {
15: Log.d(logTag, "onCreate")
16: super.onCreate()
17: }
18:
19: override fun onDestroy() {
20: Log.d(logTag, "onDestroy")
21: super.onDestroy()
22: }
23: }
これでActivityを立ち上げると、onCreate, onStartCommandの順でlogcatが出てきた(エミュレータで起動)。
そのまま放置していたが何も変わらない。
そしてアプリを閉じる(Androidのホーム表示)にすると、1分後にonDestroyがlogcatに出てきた。
たった1分かー。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。