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