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

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

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

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

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

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

まずは、アクティビティ

[HelloActivity.java]

1import android.app.Activity;
2import android.os.Bundle;
3import android.content.Intent;
4import android.content.IntentFilter;
5import android.content.BroadcastReceiver;
6 
7public class HelloActivity extends Activity {
8  IntentFilter intentFilter;
9  MyBroadcastReceiver receiver;
10 
11  @Override
12  public void onCreate(Bundle savedInstanceState) {
13    super.onCreate(savedInstanceState);
14    setContentView(R.layout.main);
15 
16    startService(new Intent(getBaseContext(), MyIntentService.class));
17 
18    receiver = new MyBroadcastReceiver();
19    intentFilter = new IntentFilter();
20    intentFilter.addAction("MY_ACTION");
21    registerReceiver(receiver, intentFilter);
22  }
23}

次に、IntentServiceクラス

[MyIntentService.java]

1import android.app.IntentService;
2import android.content.Intent;
3import android.os.Handler;
4import android.util.Log;
5import android.widget.Toast;
6 
7public class MyIntentService extends IntentService {
8 
9  final static String TAG = "MyIntentService";
10  private Handler mHandler;
11 
12  public MyIntentService(){
13    super("MyIntentService");
14    mHandler = new Handler();
15  }
16 
17  @Override
18  protected void onHandleIntent(Intent intent) {
19    Log.d(TAG, "onHandleIntent");
20    mHandler.post(new DisplayToast("サービスを開始しました。"));
21 
22    Intent broadcastIntent = new Intent();
23    broadcastIntent.putExtra(
24    "message", "Hello, BroadCast!");
25    broadcastIntent.setAction("MY_ACTION");
26    getBaseContext().sendBroadcast(broadcastIntent);
27  }
28 
29  @Override
30  public void onDestroy(){
31    super.onDestroy();
32    Log.d(TAG, "onDestroy");
33  }
34 
35 
36  private class DisplayToast implements Runnable{
37    String mText;
38      public DisplayToast(String text){
39      mText = text;
40    }
41    public void run(){
42      Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show();
43    }
44  }
45 
46}

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

[MyBroadcastReceiver.java]

1import android.content.BroadcastReceiver;
2import android.content.Context;
3import android.content.Intent;
4import android.os.Bundle;
5import android.widget.Toast;
6 
7public class MyBroadcastReceiver extends BroadcastReceiver {
8 
9  @Override
10  public void onReceive(Context context, Intent intent) {
11    Bundle bundle = intent.getExtras();
12    String message = bundle.getString("message");
13 
14    Toast.makeText(
15      context,
16      "onReceive! " + message,
17      Toast.LENGTH_LONG).show();
18  }
19 
20}

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

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

コメントを残す

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