【アンドロイドノート】BroadcastReceiver
一.BroadcastReceiverとは?
BroadcastReceiverは、中国語で放送受信者と呼ばれています.これはandroidの4つのコンポーネントの1つです.
①
ブロードキャスト受信者は、ブロードキャスト情報の受信に専念し、対応する処理を行うコンポーネントである.多くの放送はシステムが持参したものに由来する.例えば、タイムゾーンの変更を通知したり、バッテリーの電力が低くなったり、写真を撮ったり、ユーザーが言語オプションを変更したりします.アプリケーションはブロードキャストも可能です.たとえば、他のアプリケーションにデータのダウンロードが完了し、使用可能な状態にあることを通知します.
②
アプリケーションは、興味のあるすべての通知情報に応答するために、任意の数のブロードキャスト受信機を有することができる.すべての受信機はBroadcastReceiverベースクラスから継承されます.
③
ブロードキャスト受信機にはユーザインタフェースがありません.ただし、受信した情報に応答するactivityを起動したり、NotificationManagerでユーザーに通知したりすることができます.通知は、バックライトの点滅、振動、音声の再生など、ユーザーの注意力を引き付けるために多くの方法があります.一般的には、ステータスバーに永続的なアイコンを配置し、ユーザーはそれを開いてメッセージを取得することができます.
Androidの放送イベントは2種類ありますが、1つはシステム放送イベント、例えばACTION_BOOT_COMPLETED(システム起動完了後トリガー)、ACTION_TIME_CHANGED(システム時間変更時にトリガー)、ACTION_BATTERY_LOW(低電力時トリガ)など.もう1つは、カスタマイズされたブロードキャストイベントです.
二.BroadcastReceiverのライフサイクル?
BroadcastReceiverはonReceive関数の実行が終了するとライフサイクルの終了を示す.
BroadcastReceiverを使用するには、次の点に注意してください.
1.
BroadcastReceiverでは、新しいスレッドでデータをダウンロードするなどの非同期操作は適切ではありません.BroadcastReceiverが終了すると、非同期操作が完了する前にシステムkillによってプロセスが完了する可能性があります.
2.BroadcastReceiverのonReceive関数は10秒以内に完了する必要があります.そうしないとANRになります.またonReceiveのデフォルトはメインスレッドで実行されるので、
BroadcastReceiverでは時間のかかる操作は適切ではありません.ネットワークやデータベースの時間のかかる操作、ダイアログボックスの表示など、時間のかかる操作はサービス処理に任せる必要があります(現実の時間がタイムアウトする可能性があるため、Notificationで代用します).
3.ブロードキャスト受信者は、動的登録の形式で登録することを推奨します.
受信者をonResumeに登録し、onStopメソッドで受信者をアンインストールします.資源を節約できるからです.
三.使用
BroadcastReceiver
3.1 BroadcastReceiverの作成と登録
まず、ブロードキャスト受信者を定義します.BroadcastReceiver抽象クラスを継承すればよい,論理はonReceiveメソッドに書く.パラメータintentは受信した意図であり、その意図が携帯する情報(getxxx)を取得することができます.
第2のステップは、ブロードキャスト受信者を登録することである.動的登録と静的登録の2つの選択肢があります.静的登録とは、リストファイルに書き込み、動的登録とはコードに登録することである.
静的登録(アプリケーションノードの下):
動的登録:
一般にactivityに登録する.
この方法で登録されたブロードキャスト受信者は、アンインストールできます.
受信するブロードキャストに権限が必要な場合は、宣言する必要があります.
例えば、ネットワークの状況を傍受するには、権限を追加する必要があります.
メールを傍受するには、権限が必要です.
カスタムブロードキャストに権限を追加することもできます.権限が追加されると、ブロードキャスト受信者はブロードキャストを受信するためにその権限を宣言する必要があります.
注意:
動的登録と静的登録の違い
1.registerReceiverは動的登録であり、自分で手動で登録または登録解除することができる.ラベルは静的登録で、システムの起動時に自動的にスキャンして登録するので、手動で制御できず、起動中です.
2.
リソースの消費量が異なります.registerReceiverは手動で制御できるので、適切な登録と登録解除はシステムリソースを節約でき、ラベルシステムが起動してからずっと有効です.
3.使用状況が異なる.自分で送信および受信したブロードキャストはregisterReceiverで登録することができ、システム共通ブロードキャストの受信には通常ラベルで登録する.
priorityプロパティについて:
Android:priorityは優先度を示し、Androidの公式規定範囲は-1000から1000です.優先度は、順序付けされたブロードキャストにおいてより前にメッセージを取得できるようにすることにある.また、ブロードキャスト(abortBroadcastメソッド)が次のブロードキャスト受信者に伝達されないようにブロックすることができる.もちろん、手動でブロードキャスト受信者をブロードキャストのデフォルト受信者として設定した場合、ブロードキャストが他のブロードキャストにブロックされても、デフォルトのブロードキャスト受信者はブロードキャストを受信することができます.手動で設定する方法は、sendBroadcastメソッドにブロードキャスト受信者オブジェクトが入力されることです.
3つ目のステップは、ブロードキャストを送信することです.
ブロードキャスト受信者を定義した後、ブロードキャストを送信する必要があります(ブロードキャスト受信者がシステム定義のイベントを受信した場合、ブロードキャストを送信する必要はありません).ブロードキャスト受信者のonReceiveメソッドを呼び出します.
ブロードキャストAPIを送信:
3.2システム放送イベントの受信
メールの受信を例に挙げると、
インベントリファイル:
アクセス権:
上記の構成により、メールが来るのを傍受するブロードキャスト受信者を作成し、メールが来るとToastメッセージがポップアップされます.
3.3異なる放送タイプ
一般放送:
Context.を通じてsendBroadcastが送信するブロードキャストは通常ブロードキャストであり、通常ブロードキャスト受信者が受信する順序が不定であるため、受信者が受信した後に他の受信者を使用してその処理結果を停止することはできない(すなわちabortBroadcastメソッドを呼び出すことはできない).
秩序化されたブロードキャスト:
Context.を通じてsendOrderedBroadcastが送信するブロードキャストは、通常のブロードキャストとは異なり、受信者はブロードキャストを秩序正しく受信し、ブロードキャストを修正したり、ブロードキャストを下に転送したりすることができる.システムは、受信者が定義した優先度順に基づいて、どの受信者が先に受信するかを決定し、受信者が処理した後、優先度の低い受信者に結果を渡すことができ、他の優先度の低い受信者がブロードキャストを受信できないようにブロードキャストを停止することができる.優先度はandroid:priorityプロパティで定義され、数値が大きいほど優先度が高くなり、値範囲:-1000から1000まで、Androidシステムはメールを受信し、電話を受けた後に送信する放送は秩序正しく放送されるので、メールや電話の遮断、すなわち放送をキャンセルすることができます.
スティッキーブロードキャスト:
Sticky Broadcast.送信者がある放送を送信し、受信者がこの放送を送信してから自分のReceiverに登録すると、受信者は先ほどの放送を受信できなくなります.このためAndroidはStickyBroadcastを導入し、放送送信終了後に送信したばかりの放送(Intent)を保存します.これにより、受信者がReceiverに登録した後も先ほどの放送を使用することができます.受信者登録が完了する前に同じActionのスティッキーブロードキャストが複数送信された場合、登録が完了すると、そのActionのブロードキャストは1つしか受信されず、メッセージコンテンツは最後のブロードキャストコンテンツである.システムネットワーク状態の変化送信のブロードキャストは粘性ブロードキャストである.スティッキーブロードキャストはContextのsendStickyBroadcast(Intetn)インタフェースを通じて送信され、権限を追加する必要があります.
また、ContextのremoveStickyBroadcast(Intent intent)インタフェースからキャッシュされたスティッキーブロードキャストを除去することもできます.
ローカルブロードキャスト:
AndroidはLocalBroadcastManagerを導入してセキュリティの問題を解決し、LocalBroadcastManagerはBroadcastReceiverプロセス間のセキュリティの問題を解決できるほか、Context操作のBroadcastReceiverに比べてより高い稼働効率を有する.このクラスはsupportパッケージにあり、具体的には次の部分を参照してください.
四.BroadcastReceiverのセキュリティの概要
BroadcastReceiverの設計の目的は、アプリケーションとシステム、アプリケーション間、アプリケーション内の通信を容易にするため、単一のアプリケーションにとってBroadcastReceiverはセキュリティの問題があり、対応する問題と解決は以下の通りです.
1.アプリケーションがブロードキャストを送信すると、送信されたIntentは、システムに登録されているすべてのBroadcastReceiverのIntentFilterと一致し、一致に成功すると対応するonReceive関数が実行されます.sendBroadcast(Intent,String)のようなインタフェースを使用して、ブロードキャストの送信時に受信者が備えなければならないpermissionを指定できます.またはIntent.setPackage設定ブロードキャストは、プログラムに対してのみ有効です.
2.アプリケーションがブロードキャストを登録した場合、IntentFilterが設定されていても他のアプリケーションからのブロードキャストを受信してマッチング判定を行う.動的に登録されたブロードキャストについては、registerReceiver(BroadcastReceiver,IntentFilter,String,android.os.Handler)のようなインタフェースを使用して送信者が備えなければならないpermissionを指定することができ、静的に登録されたブロードキャストについては、android:exported=「false」の属性によって、受信者が外部アプリケーションに対して使用できないこと、すなわち外部からのブロードキャストを受け入れないことを示すことができる.
3.LocalBroadcastManagerを使用します.このクラスはsupportパッケージにあります.使用方法は次のとおりです.
BroadcastReceiverは、中国語で放送受信者と呼ばれています.これはandroidの4つのコンポーネントの1つです.
①
ブロードキャスト受信者は、ブロードキャスト情報の受信に専念し、対応する処理を行うコンポーネントである.多くの放送はシステムが持参したものに由来する.例えば、タイムゾーンの変更を通知したり、バッテリーの電力が低くなったり、写真を撮ったり、ユーザーが言語オプションを変更したりします.アプリケーションはブロードキャストも可能です.たとえば、他のアプリケーションにデータのダウンロードが完了し、使用可能な状態にあることを通知します.
②
アプリケーションは、興味のあるすべての通知情報に応答するために、任意の数のブロードキャスト受信機を有することができる.すべての受信機はBroadcastReceiverベースクラスから継承されます.
③
ブロードキャスト受信機にはユーザインタフェースがありません.ただし、受信した情報に応答するactivityを起動したり、NotificationManagerでユーザーに通知したりすることができます.通知は、バックライトの点滅、振動、音声の再生など、ユーザーの注意力を引き付けるために多くの方法があります.一般的には、ステータスバーに永続的なアイコンを配置し、ユーザーはそれを開いてメッセージを取得することができます.
Androidの放送イベントは2種類ありますが、1つはシステム放送イベント、例えばACTION_BOOT_COMPLETED(システム起動完了後トリガー)、ACTION_TIME_CHANGED(システム時間変更時にトリガー)、ACTION_BATTERY_LOW(低電力時トリガ)など.もう1つは、カスタマイズされたブロードキャストイベントです.
二.BroadcastReceiverのライフサイクル?
BroadcastReceiverはonReceive関数の実行が終了するとライフサイクルの終了を示す.
BroadcastReceiverを使用するには、次の点に注意してください.
1.
BroadcastReceiverでは、新しいスレッドでデータをダウンロードするなどの非同期操作は適切ではありません.BroadcastReceiverが終了すると、非同期操作が完了する前にシステムkillによってプロセスが完了する可能性があります.
2.BroadcastReceiverのonReceive関数は10秒以内に完了する必要があります.そうしないとANRになります.またonReceiveのデフォルトはメインスレッドで実行されるので、
BroadcastReceiverでは時間のかかる操作は適切ではありません.ネットワークやデータベースの時間のかかる操作、ダイアログボックスの表示など、時間のかかる操作はサービス処理に任せる必要があります(現実の時間がタイムアウトする可能性があるため、Notificationで代用します).
3.ブロードキャスト受信者は、動的登録の形式で登録することを推奨します.
受信者をonResumeに登録し、onStopメソッドで受信者をアンインストールします.資源を節約できるからです.
三.使用
BroadcastReceiver
3.1 BroadcastReceiverの作成と登録
まず、ブロードキャスト受信者を定義します.BroadcastReceiver抽象クラスを継承すればよい,論理はonReceiveメソッドに書く.パラメータintentは受信した意図であり、その意図が携帯する情報(getxxx)を取得することができます.
public class NetworkReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//TODO
}
}
第2のステップは、ブロードキャスト受信者を登録することである.動的登録と静的登録の2つの選択肢があります.静的登録とは、リストファイルに書き込み、動的登録とはコードに登録することである.
静的登録(アプリケーションノードの下):
<receiver android:name="MyBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name=“" />
</intent-filter>
</receiver>
動的登録:
一般にactivityに登録する.
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
この方法で登録されたブロードキャスト受信者は、アンインストールできます.
public void unregisterReceiver(BroadcastReceiver receiver)
受信するブロードキャストに権限が必要な場合は、宣言する必要があります.
例えば、ネットワークの状況を傍受するには、権限を追加する必要があります.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
メールを傍受するには、権限が必要です.
< uses-permission android:name = "android.permission.RECEIVE_SMS" />
カスタムブロードキャストに権限を追加することもできます.権限が追加されると、ブロードキャスト受信者はブロードキャストを受信するためにその権限を宣言する必要があります.
注意:
動的登録と静的登録の違い
1.registerReceiverは動的登録であり、自分で手動で登録または登録解除することができる.
2.
リソースの消費量が異なります.registerReceiverは手動で制御できるので、適切な登録と登録解除はシステムリソースを節約でき、
3.使用状況が異なる.自分で送信および受信したブロードキャストはregisterReceiverで登録することができ、システム共通ブロードキャストの受信には通常
priorityプロパティについて:
Android:priorityは優先度を示し、Androidの公式規定範囲は-1000から1000です.優先度は、順序付けされたブロードキャストにおいてより前にメッセージを取得できるようにすることにある.また、ブロードキャスト(abortBroadcastメソッド)が次のブロードキャスト受信者に伝達されないようにブロックすることができる.もちろん、手動でブロードキャスト受信者をブロードキャストのデフォルト受信者として設定した場合、ブロードキャストが他のブロードキャストにブロックされても、デフォルトのブロードキャスト受信者はブロードキャストを受信することができます.手動で設定する方法は、sendBroadcastメソッドにブロードキャスト受信者オブジェクトが入力されることです.
3つ目のステップは、ブロードキャストを送信することです.
ブロードキャスト受信者を定義した後、ブロードキャストを送信する必要があります(ブロードキャスト受信者がシステム定義のイベントを受信した場合、ブロードキャストを送信する必要はありません).ブロードキャスト受信者のonReceiveメソッドを呼び出します.
ブロードキャストAPIを送信:
public void sendBroadcast(Intent intent)
public void sendStickyBroadcast(Intent intent)
public void sendOrderedBroadcast(Intent intent, String receiverPermission)
public void sendStickyOrderedBroadcast(
Intent intent, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData,
Bundle initialExtras)
3.2システム放送イベントの受信
メールの受信を例に挙げると、
package cn.edu.chd.broadcastreceiverdemo.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, " ...",1).show();
}
}
インベントリファイル:
<receiver
android:name="cn.edu.chd.broadcastreceiverdemo.receiver.SmsReceiver"
>
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
アクセス権:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
上記の構成により、メールが来るのを傍受するブロードキャスト受信者を作成し、メールが来るとToastメッセージがポップアップされます.
3.3異なる放送タイプ
一般放送:
Context.を通じてsendBroadcastが送信するブロードキャストは通常ブロードキャストであり、通常ブロードキャスト受信者が受信する順序が不定であるため、受信者が受信した後に他の受信者を使用してその処理結果を停止することはできない(すなわちabortBroadcastメソッドを呼び出すことはできない).
秩序化されたブロードキャスト:
Context.を通じてsendOrderedBroadcastが送信するブロードキャストは、通常のブロードキャストとは異なり、受信者はブロードキャストを秩序正しく受信し、ブロードキャストを修正したり、ブロードキャストを下に転送したりすることができる.システムは、受信者が定義した優先度順に基づいて、どの受信者が先に受信するかを決定し、受信者が処理した後、優先度の低い受信者に結果を渡すことができ、他の優先度の低い受信者がブロードキャストを受信できないようにブロードキャストを停止することができる.優先度はandroid:priorityプロパティで定義され、数値が大きいほど優先度が高くなり、値範囲:-1000から1000まで、Androidシステムはメールを受信し、電話を受けた後に送信する放送は秩序正しく放送されるので、メールや電話の遮断、すなわち放送をキャンセルすることができます.
スティッキーブロードキャスト:
Sticky Broadcast.送信者がある放送を送信し、受信者がこの放送を送信してから自分のReceiverに登録すると、受信者は先ほどの放送を受信できなくなります.このためAndroidはStickyBroadcastを導入し、放送送信終了後に送信したばかりの放送(Intent)を保存します.これにより、受信者がReceiverに登録した後も先ほどの放送を使用することができます.受信者登録が完了する前に同じActionのスティッキーブロードキャストが複数送信された場合、登録が完了すると、そのActionのブロードキャストは1つしか受信されず、メッセージコンテンツは最後のブロードキャストコンテンツである.システムネットワーク状態の変化送信のブロードキャストは粘性ブロードキャストである.スティッキーブロードキャストはContextのsendStickyBroadcast(Intetn)インタフェースを通じて送信され、権限を追加する必要があります.
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
また、ContextのremoveStickyBroadcast(Intent intent)インタフェースからキャッシュされたスティッキーブロードキャストを除去することもできます.
ローカルブロードキャスト:
AndroidはLocalBroadcastManagerを導入してセキュリティの問題を解決し、LocalBroadcastManagerはBroadcastReceiverプロセス間のセキュリティの問題を解決できるほか、Context操作のBroadcastReceiverに比べてより高い稼働効率を有する.このクラスはsupportパッケージにあり、具体的には次の部分を参照してください.
四.BroadcastReceiverのセキュリティの概要
BroadcastReceiverの設計の目的は、アプリケーションとシステム、アプリケーション間、アプリケーション内の通信を容易にするため、単一のアプリケーションにとってBroadcastReceiverはセキュリティの問題があり、対応する問題と解決は以下の通りです.
1.アプリケーションがブロードキャストを送信すると、送信されたIntentは、システムに登録されているすべてのBroadcastReceiverのIntentFilterと一致し、一致に成功すると対応するonReceive関数が実行されます.sendBroadcast(Intent,String)のようなインタフェースを使用して、ブロードキャストの送信時に受信者が備えなければならないpermissionを指定できます.またはIntent.setPackage設定ブロードキャストは、プログラムに対してのみ有効です.
2.アプリケーションがブロードキャストを登録した場合、IntentFilterが設定されていても他のアプリケーションからのブロードキャストを受信してマッチング判定を行う.動的に登録されたブロードキャストについては、registerReceiver(BroadcastReceiver,IntentFilter,String,android.os.Handler)のようなインタフェースを使用して送信者が備えなければならないpermissionを指定することができ、静的に登録されたブロードキャストについては、android:exported=「false」の属性によって、受信者が外部アプリケーションに対して使用できないこと、すなわち外部からのブロードキャストを受け入れないことを示すことができる.
3.LocalBroadcastManagerを使用します.このクラスはsupportパッケージにあります.使用方法は次のとおりです.
:LocalBroadcastManager.getInstance(context).registerReceiver
:LocalBroadcastManager.getInstance(context).unregisterReceiver
:LocalBroadcastManager.getInstance(context).sendBroadcast(intent)