[Android]ブロードキャストインテントを受け取る | 妄想プログラマのらくがき帳

2013年3月11日月曜日

[Android]ブロードキャストインテントを受け取る

Androidには明示的/暗黙的インテントの他にブロードキャストインテントという仕組みがあります。
明示的/暗黙的インテントは特定のアクティビティのみが受信するのに対して、
ブロードキャストインテントは複数の受信者(レシーバ)が受信することができます。

ブロードキャストインテントの一例を挙げます。例えば、
・バッテリー残量が残り少なくなった
・スクリーンがONになった
といったイベントが発生したとき、Androidシステムはブロードキャストインテントを送信します。
複数の受信者はこれらのインテントを受け取ることで、イベント発生を知ることができ、各々の適切な処理を行うことができます。

システムから送信されるブロードキャストインテントには以下のようなものがあります。

ACTION_TIME_TICK現在時刻が変わった(分ごとに送信)。
ACTION_BOOT_COMPLETEDシステムの起動が完了した。
ACTION_BATTERY_CHANGEDバッテリーの状態が変化した。

この他にも多くのブロードキャストインテントが定義されています。
(http://developer.android.com/reference/android/content/Intent.htmlを参照)

また、独自のインテントをブロードキャストすることもできます。
// 独自のインテントをブロードキャスト送信
Intent myBroadcast = new Intent("com.example.broadcastsender.BUTTON_CLICKED");
sendBroadcast(myBroadcast);

ブロードキャストインテントはブロードキャストレシーバに対して送信されるので、
受信するにはブロードキャストレシーバを登録する必要があります。

ブロードキャストレシーバを登録する

登録方法は2通りあります。

1.registerReceiver()で動的に登録する
以下のサンプルコードは、ACTION_TIME_TICKを受信したら現在時刻をTextViewに表示するものです。
ACTION_TIME_TICKのレシーバをonCreate()内で動的に登録しています。
public class MainActivity extends Activity {

    private TextView textView;
    BroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        // ACTION_TIME_TICKを受信するレシーバを登録する
        IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // ACTION_TIME_TICKを受信したら、TextViewに時刻を表示する
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
                textView.setText(dateFormat.format(new Date()));
            }
        };
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        // 登録したレシーバを解除する
        unregisterReceiver(receiver);
        super.onDestroy();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

2. マニフェストファイルで静的に登録する
静的に登録するには、マニフェストファイルでレシーバを登録します。
登録するレシーバはBroadcastReceiverを継承して作成しておきます。
public class BatteryLowReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // BATTERY_LOWを受信したらメッセージを表示
        Toast.makeText(context, "Battery low!", Toast.LENGTH_LONG).show();
    }
}
マニフェストファイルでは、受信するインテントとレシーバを設定します。
        <receiver android:name="com.example.broadcastreceivesample.BatteryLowReceiver">
            <intent-filter ><action android:name="android.intent.action.BATTERY_LOW"/></intent-filter>
        </receiver>

0 件のコメント:

コメントを投稿