カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

バックグラウンドのサービスから、終了通知を受け取る

この記事は最終更新日から1年以上経過しています。

IntentServiceでバックグラウンドにて処理を実行し、
完了の通知を受け取るにはブロードキャストレシーバーを使用して実現できます。
IntentFilterとBroadcastReceiverを使って、アクティビティとサービス間で通信します。

IntentServiceを利用するためのマニフェストへの記述

<application ...>
    <service android:name="MyIntentService"></service>
</application>

まずは、アクティビティ

[HelloActivity.java]

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;

public class HelloActivity extends Activity {
  IntentFilter intentFilter;
  MyBroadcastReceiver receiver;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    startService(new Intent(getBaseContext(), MyIntentService.class));

    receiver = new MyBroadcastReceiver();
    intentFilter = new IntentFilter();
    intentFilter.addAction("MY_ACTION");
    registerReceiver(receiver, intentFilter);
  }
}

次に、IntentServiceクラス

[MyIntentService.java]

import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;

public class MyIntentService extends IntentService {

  final static String TAG = "MyIntentService";
  private Handler mHandler;

  public MyIntentService(){
    super("MyIntentService");
    mHandler = new Handler();
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    Log.d(TAG, "onHandleIntent");
    mHandler.post(new DisplayToast("サービスを開始しました。"));

    Intent broadcastIntent = new Intent();
    broadcastIntent.putExtra(
    "message", "Hello, BroadCast!");
    broadcastIntent.setAction("MY_ACTION");
    getBaseContext().sendBroadcast(broadcastIntent);
  }

  @Override
  public void onDestroy(){
    super.onDestroy();
    Log.d(TAG, "onDestroy");
  }


  private class DisplayToast implements Runnable{
    String mText;
      public DisplayToast(String text){
      mText = text;
    }
    public void run(){
      Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show();
    }
  }

}

最後に、ブロードキャストレシーバーのクラス

[MyBroadcastReceiver.java]

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    String message = bundle.getString("message");

    Toast.makeText(
      context, 
      "onReceive! " + message, 
      Toast.LENGTH_LONG).show();
  }

}

※このクラスは、メインアクティビティのクラス内に内部クラスとして定義してもかまいません。

この記事がお役に立ちましたらシェアお願いします
17,783 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です