2021/05/23

[android]サービス

前回、画面を作るのはFlutterとかに任せるとして、OSに依存した部分を覚えようということになった。

まずは基本要素のサービスだろう。
と思ったのだが、ドキュメントのメニューを見て迷いが生じた。

image

サービスはバックグラウンドで動くものだったはずだが...

バックグラウンドタスクというのは、バックグラウンドで動くタスクの総称のようで、サービスがバックグラウンドで動き続けるのと比べると、ワンショットで終わったり、定期的に実行したり、指定した時間に実行したりと、ちょっと意味合いが違うようだ。

意味合いが違うのは、単位が違うからでもあろう。
サービスは「アプリコンポーネント」で、バックグランドタスクは「タスク」。
アプリコンポーネントが指すのは4つしかない。

  • アクティビティ
  • サービス
  • ブロードキャストレシーバ
  • コンテンツプロバイダ

四天王というところか。

サービスを使うかどうかは作るアプリの性質に因るだろう。ユーザに見えない形で処理をしたいことはしばしばあるだろうが、例えばボタンをタップして処理が終わるまで待ち状態のアニメーションを表示して、処理が終わったら画面を更新する、みたいなことをするとしよう。たぶんそれだけであればサービスは使わず、バックグラウンドタスクでよいだろうし、たぶんそれも意識せずにFlutterなどがやってくれるんじゃないだろうか。

サービスを使うのはバックグラウンドで長期的に動いていないといけないような、音楽の再生や通知待ちだとかになるのだろう。通知待ちにして待つもの次第で変わって、場合によってはブロードキャストレシーバとかでよいのかもしれない。


サービスはユーザインターフェースを持たない、と書いてある。私としては音楽再生もユーザインターフェースの一つ(何か操作して音楽が鳴り始めるなら、音楽は操作した結果をユーザに分からせるというUI)と考えてもよいんじゃないかと思うのだが、そういうのは専門じゃないのでよくわからん。組み込みの世界だと、LEDの点滅のさせ方とかビープ音をUIとして扱うからね。

それはともかく。
サービスとしては画面がないということだろう。そして種類として「サービスが動いていることをユーザが直接分かる(音楽が鳴っているとか)」「サービスが動いていることをユーザが分からない」の2種類があると書かれている。

ユーザが直接分かるタイプの場合は、サービスが強制終了させられるとユーザに不便が生じるので、実行が維持されるよう「最善を尽くす」ようだ。善処します、ということかな。

そうじゃないタイプの方は、システム側が好き勝手に終了させてもいいよね、という扱いなのだろう。電力消費や他のアプリを行かすことを考えるとこちらの方が望ましい。だってスマホのアプリを起動するとき、今使っているアプリを終了させてから、とかやる人はあんまりいないだろうからだ。

しかし困ったことに、「一度起動したんだから動いてるよね」と思ってしまうのも確かだ。なので、アプリを作る人はどちらのタイプにせよシステムから終了させられてもよいようにする必要がある。

 

と書くのは簡単なのだが、サービスを使う以上は裏で動き続けたいという気持ちがあるからなので、終わってもらっても困る。アプリ・・・アクティビティが前面に出ているときだけ動けばよいなら終わってもよいのだが(アクティビティの終了以降にサービスが終了するならば)、待ち受けるタイプのアプリで、しかもいつやってくるのかわからないようなタイプだと、待っている間に別のアプリを立ち上げるというのは十分に考えられる。

そのときの捌き方を覚えないと行かんな。

0 件のコメント:

コメントを投稿

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