Broadcastを送受信する
Sending and Receving Broadcasts
Androidでは、broadcastは開発しているアプリケーションの
(関係の無い他のアプリケーションでも可能)
他の部分にメッセージを送らせてくれます。
メッセージを送ることで起こっているなにかの情報をアプリケーションに
伝えることができます。
ここではbroadcastの内容を理解するbroadcastレシーバと同じように、
他のアプリケーションにbroadcastを送るコードを作ります。
broadcastレシーバを作るには2つの方法が有ります。
コードを通してプログラムに従って行うことと、
AndroidManifest.xml経由で記述する方法です。
それぞれのやり方の解決法を以下に示します。
まずbroadcastレシーバをプログラムに従って登録させていく方法です。
以下のアクティビティを考えます。
package net.learn2develop.usingbroadcastreceiver;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActiviry extends Activity{
MyBroadcastReceiver myReceiver;
IntentFilter intentFilter;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mail);
myReceiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter("MY_SPECIFIC_ACTION");
}
@Override
public void onResume(){
super.onResume();
//---register the receiver---
registerReceiver(myReceiver, intentFilter);
}
@Override
public void onPause(){
super.onPause();
//---unregister the receiver---
unregisterReceiver(myReceiver);
}
public void onClick(View view){
Intent i = new Intent("MY_SPECIFIC_ACTION");
i.putExtra("key", "some value from intent");
sendBroadcast(i);
}
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent i){
Toast.makeText(context,
"Received broadcast in MyBroadcastReceiver, " +
" value received: " + i.getStringExtra("key"),
Toast.LENGTH_LONG).show();
}
}
}
このコードは内部クラスBroadcastReceiverを元にしたクラスを拡張した
MyBroadcastReceiverを使っています。
このクラスでは、broadcastを受け取ったときのために
onReceive()メソッドを無効にする必要があり、
動かしたい動作を行うことができます。
レシーバに渡すデータを得るためには、
onReceive()メソッドの二番目にあるIntentオブジェクトを使用します。
このMyBroadcastReceiverクラスを使うためには、
IntentFilterオブジェクトを作るのと同じように、
このクラスの実例を作る必要があります。
myReceiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter("MY_SPECIFIC_ACTION");
IntentFilterコンストラクタのユーザ定義された動作を指定し、
この動作を定義するために開発者自身の文字列を使います。
BroadcastReceiverオブジェクトを登録するために、
registerReceiver()メソッドを使い、IntentFilterオブジェクトと同じように
BroadcastReceiverオブジェクトを渡します。
registerReceiver(myReceiver, intentFilter);
BroadcastReceiverオブジェクトを登録してあれば、
broadcastの送信が働くかどうかをテストすることができます。
broadcastを送信するためには、sendBroadcastメソッドを使い、
Intentオブジェクトを渡します。
public void onClick(View view){
Intent i = new Intent("MY_SPECIFIC_ACTION");
i.putExtra("key", "some value from intent");
sendBroadcast(i);
}
もし、レシーバにデータを渡したいとしたら、
putExtra()メソッドを使います。
broadcastレシーバを登録させないためには、
unregisterReceiver()メソッドを使います。
unregisterReceiver(myReceiver);
これでbroadcastが他のアプリケーションからのものだとしても、
broadcastレシーバは狙い通り動きます。
次にAndrooidManifest.xmlファイルでの
BroadcastReceiverを登録させます。
broadcastレシーバをプログラムに従って登録する方法では、
もし、アプリケーションがバックグラウンドで走っているときには、
broadcastが登録されていないためbroadcastレシーバは
まるで働きません。
@Override
public void onPause(){
super onPause();
//---unregister the receiver---
unregisterReceiver(myReceiver);
}
もし持続的にbroadcastを受け取りたいと考えるならば、
AndroidManifest.xmlファイルにBroadcastReceiverクラスを
登録する必要があります。
BroadcastReceiverクラスを登録するには、他のJavaクラスに
BroadcastReceiverクラスを作ります。
以下のコードはMySecondBroadcastReceiver.javaファイルの
内容になります。
package net.learn2develop.usingbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MySecondBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, intent i){
Toast.makeText(context,
Received broadcast in MySecondBroadcastReceiver; " +
" value received: " + i.getStringExtra("key"),
Toast.LENGTH_LONG).show();
}
}
AndroidManifest.xmlファイルにこのレシーバを登録するためには、
<receiver>要素を加えます。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.learn2develop.usingbroadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<applicaton
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_mail" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<intent-filter>
<activity>
receiver android:name=".MySecondBroadcastReceiver" >
<intent-filter>
<action android:name="MY_SPECIFIC_ACTION" />
<intent-filter>
receiver>
<application>
<manifest>
このコードでBroadcastReceiverを2つ持つことになります。
1つはonResume()メソッドにプログラムに従って登録されるもので、
もう1つは、AndrooidManifest.xmlでの登録になります。
もし、Broadcastを今送信したら、両方のレシーバが呼び出されます。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
|