[Android] IntentServiceでバックグラウンド処理を簡単に実行させる

Serviceはバックグラウンドで動作してくれるので別スレッドで実行しているのかと思ってしまいます。バックグラウンドという特性からすると別スレッドでと思うのですが実際はメインスレッドを使っているのですね。

IntentServiceは最初からそれを想定して作られています。またワークキューを使った順次処理を行えます。
 
intentservice 01 - [Android] IntentServiceでバックグラウンド処理を簡単に実行させる

Android Studio 3.5.3
API 29

 

R904D.P21641J - [Android] IntentServiceでバックグラウンド処理を簡単に実行させるimpression?a id=2545321&p id=969&pc id=1263&pl id=47128 - [Android] IntentServiceでバックグラウンド処理を簡単に実行させる

IntentService

 
Googleのドキュメントにはこのようにあります。

サービスは、そのホスト プロセスのメインスレッドで実行します。サービスが自身のスレッドを作成することはなく、別のプロセスで実行されることもありません(別の方法を指定しない限り)。 つまり、サービスが CPU を集中的に使ったり、ブロック操作を行ったりするような場合(MP3 の再生やネットワーク作業)は、サービス内に新しいスレッドを作成してその作業を行う必要があります。

Ref: サービス | Android Developers
 
簡単に別スレッドを使うことができるのがIntentServiceです。
更にワークキューを使って要求されたタスクを一つづつ実行し、
全てが終わると自ら終了してくれます。
 

 

別スレッドとワークキュー

 
IntentServiceは簡単には以下のようになります。
コンストラクタが必要でスレッドの名前を設定します。
 

 
別スレッドでの処理はあくまでキューに入れられたIntentの順番
intentservice 01 - [Android] IntentServiceでバックグラウンド処理を簡単に実行させる
 
作業が終わってもServiceではstopSelf() や stopService() を呼び出して自身でサービスを停止しないと行けない場合がありますが、IntentServiceでは必要がありませんが、これは楽ですね。

 

サンプルコード

 
サービス | Android Developers
にある例を元に簡単なIntentServiceを作ってみます。
 
MainActivity.java

 
IntentServiceの記述
1秒のスリープを入れて10回カウントしたら終了させます。
onCreate(), onStartCommand(), onDestroy() などは特にこのケースでは必要ないのですが
ワーカー スレッドの生存状態を正しく処理できるよう、必ず super を実装しないといけないようです。

TestIntentService.java

 
Serviceの登録も忘れずに

AndroidManifest.xml

 
レイアウトとリソースです
activity_main.xml

 
strings.xml

 
IntentServiceのログをみると確かにタスクが終わると終了しているようです。
 

 

Gameの効果音

 
例えばゲームで効果音を出したいときに、メインスレッドで重い画像処理などをしているケースでは別スレッドでやりたいところです。
IntentServiceを使うとどうでしょうか、SoundPoolを使って効果音の再生を試してみましょう。
SoundPoolの使い方はこちらを参考にして、このコードをIntentServiceに組み込んでみます。
 

soundpool 00 100x100 - [Android] IntentServiceでバックグラウンド処理を簡単に実行させる
音を扱うクラスとしてSoundPoolがあり、比較的短いものを遅延が少なく再生できるのでゲームの効果音の再生などに向いています。   下...

 
注意点は、MediaPlayerでもそうですが、音声データがダウンロードされてから再生を始めるという点です。
ロードが終わったかどうかを調べるのには、リスナーをセットしてonLoadCompleteから返されるステータスが0の時です。
SoundPool.OnLoadCompleteListener
 
MainActivity.javaおよびレイアウトなどは同じです。
TestIntentService.java

 
SoundPoolのR.raw.oneはone.wavをresource\raw 以下に配置したものです。
 
 
関連ページ:

 

アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
Androidアプリコース



Code Camp
現役エンジニアによるオンラインプログラミングスクール【CodeCamp】


直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。



侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする