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

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

IntentServiceは最初からそれを想定して作られています。またワークキューを使った順次処理を行えます。
 

Android Studio 3.1.1
Android 8.1.0

 



IntentService

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

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

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

 

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

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

 
別スレッドでの処理はあくまでキューに入れられたIntentの順番

 
作業が終わっても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があり、比較的短いものを遅延が少なく再生できるのでゲームの効果音の再生などに向いています。   下...

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

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

 

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加


 


ページのトップへ戻る




シェアする

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

フォローする