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

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

IntentServiceは最初からそれを想定して作られています。またワークキューを使った順次処理を行えます。(API 30から非推奨)
 
1x1.trans - [Android] IntentServiceでバックグラウンド処理を簡単に実行させる


Android Studio 3.5.3
API 29

 




IntentService

 

(注)  IntentServiceによるとこのAPI 30から非推奨となりました。
代案としては WorkManager、あるいは JobIntentServiceで扱うしかないようです

以下、古いバージョンのサポートのために残しておきます

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

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

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

 

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

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


 
別スレッドでの処理はあくまでキューに入れられたIntentの順番
1x1.trans - [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 以下に配置したものです。
 
 
関連ページ:

 

シェアする

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

フォローする