ウェブアプリケーション,インジェクション,コマンドインジェクション

androidアプリケーション開発の基本

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を中断させる理由にはなりません。


ホーム
便利堂ロゴ
inserted by FC2 system