Categories
SugiBlog ホームページ制作・システム開発

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

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();
  }

}

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

12,175 views

コメントを残す

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

*