Broadcastに優先順位をつける
Assigning Priorities Broadcast Receivers
sendBroadcast()メソッドを使ってbroadcastを送信する時には、
指定された動作に当てはまるすべてのbroadcastレシーバが
ランダムな流れで呼び出されます。
いくつかのbroadcastレシーバが他のレシーバの呼び出すために、
特定のbroadcastレシーバに要求を
割り当てたい場合はどうすればいいのでしょうか?
そのためには、broadcastレシーバに優先権を割り当てる必要があります。
プログラムに従ってsetPriority()メソッドを使ってbroadcastレシーバに
優先権を割り当てます。
public class MainActivity extends Activity{
MyBroadcastReceiver myReceiver;
IntentFilter intentFilter;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter("MY_SPECIFIC_ACTION");
}
@Override
public void onResume(){
super.onResume();
intentFilter.setPriority(10);
registerReceiver(myReceiver, intentFilter);
}
このsetPriority()メソッドは、優先権の値、
初期設定の0から1000までの値をとります。
優先権の値はより大きいほど高い優先権をもち、
優先されるようになります。
この設定によって、優先権の低いbroadcastレシーバより先に
優先権の高いレシーバが呼び出されることになります。
もし複数のbroadcastレシーバが同じ優先権をもっていたら、
ランダムに呼び出されることになります。
コードの中に出てきたintentFilterの優先度は10にセットされてます。
AndrooidManifest.xmlファイルの
broadcastレシーバの優先権をセットするには、
android:priority属性を使用します。
<receiver android:name=".MySecondBroadcastReceiver" >
<intent-filter android:priority="50">
<action android:name="MY_SPECIFIC_ACTION" />
</intent-filter>
</receiver>
このAndrooidManifest.xmlでセットされた優先権は50です。
broadcastレシーバに引き渡されたbroadcastを高い優先権で
送信するためには、まず、
sendBroadcast()メソッドを使えないので、代わりに
sendOrderBroadcast()メソッドを使う必要があります。
加えて、broadcastを受け取るためには、
レシーバにはすべての許可を付加させなければなりません。
public void onClick(View view){
Intent i = new Intent("MY_SPECIFIC_ACTION");
i.putExtra("key", "some value from intent");
//sendBroadcast(i);
//---allows broadcast to be aborted---
//---allows broadcast receivers to set priority---
sendOrderedBroadcast(i, null);
}
もし、broadcastを今送ろうとしたときには、
まず呼び出されたAndrooidManifest.xmlの中にbroadcastレシーバが
宣言されていると通知し、その前にコードを通じて
プログラムに従って宣言されます。
もしbroadcastをbroadcastレシーバにだけインターネットにアクセスする
権限を持たせて送りたい場合には、
sendOrderedBroadcast()の二番目の引数にインターネットへの
アクセス許可を下記のように示します。
sendOrderedBroadcast(i, "android.permission.INTERNET");
Broadcastを中断します。
sendOrderedBroadcast()メソッドを使って、broadcastを送信する時には、
定義された優先権の順にbroadcastレシーバが呼び出されます。
高い優先権を持つbroadcastレシーバがbroadcastを
受け取ったときには、レシーバは受け取ったbroadcastを処理し、
ラインにある次のbroadcastレシーバにbroadcastが渡されていきます。
いくつかのシナリオでは、
broadcastを処理したくなったり、broadcastが次のレシーバに
広まらないようにしたくなるかもしれません。
これを実現するには、abortBroadcast()メソッドを使うことができます。
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();
//---abort the broadcast---
abortBroadcast();
}
}
このコード部分は、MySecondBroadcastReceiverクラスは、
broadcastを受け取った後にその後の送信を中断させるものです。
Broadcastが中断されると、ラインで待っている他のレシーバは、
broadcastを受け取れなくなります。
ちょっと注釈
Broadcastを中断させるために
abortBroadcast()メソッドを呼び出すには、
sendOrderBroadcast()メソッドを使ってbroadcastを
送信する必要があります。
sendBroadcast()メソッドを使うのは優先権上の効果は無く、
broadcastを中断させる理由にはなりません。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
|