Android BoardcastReceiverの使い方

3880 ワード

あなたのアプリケーションは、電話が呼び出されたときやデータネットワークが利用可能なときなど、興味のある外部イベントのみを受信して応答するために、外部イベントをフィルタリングすることができます.ブロードキャスト受信機にはユーザインタフェースがありません.ただし、受信した情報に応答するactivityまたはsericeを起動したり、NotificationManagerでユーザーに通知したりすることができます.通知は、バックライトの点滅、振動、音声の再生など、ユーザーの注意力を引き付けるために多くの方法があります.一般的には、ステータスバーに永続的なアイコンを配置し、ユーザーはそれを開いてメッセージを取得することができます.
ブロードキャストの種類:
通常放送、Context.を通じてsendBroadcast(Intent myIntent)が送信する
秩序あるブロードキャスト、Context.を通じてsendOrderedBroadcast(intent,receiverPermission)が送信し、この方法の2番目のパラメータはブロードキャストのレベルを決定し、レベル数値は-1000から1000の間であり、値が大きいほど送信の優先度が高くなる.ブロードキャスト受信者がブロードキャストを受信するときのレベルレベル(intentfilterのpriorityで2147483647に設定できる場合が最も優先度が高い)は、同じレベルで受信する前後がランダムであり、さらにレベルの低い受信ブロードキャストまで、高いレベルまたは同じレベルで先にブロードキャストを受信する場合はabortBroadcast()方法でブロードキャストを遮断して他の受信者がこのブロードキャストを受信できないようにすることができ、その他の構造関数もある.
非同期放送、Context経由sendStickyBroadcast(Intent myIntent)が送信し、sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras)メソッドもあり、この方法は秩序ある放送の特性も非同期放送の特性もある.非同期放送を送信するには、権限があり、Intentを受信して処理した後も、removeStickyBroadcast(intent)を呼び出してアクティブに削除するまで放送は存在します.
注意:ブロードキャスト送信時のintentパラメータとContex.startActivity()が起動したIntentとは異なり、前者は複数の購読ブロードキャスト受信機によって呼び出され、後者は1つの(Activityまたはservice)によってのみ呼び出される.
ブロードキャストIntentステップのリスニング:
1、BroadCastReceiverを継承するクラスを書き、onReceive()メソッドを書き換える
public class SMSReceiver extends BroadcastReceiver{
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "SMSReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive     ");
//        if(intent.getAction().equals(action)){
//            Toast.makeText(context, "    2333333", Toast.LENGTH_LONG).show();
//            Log.d(action, "  ");
//        }
        switch (intent.getAction()) {
        case SMS_RECEIVED:
            
            //Toast.makeText(context, "    2333333", Toast.LENGTH_LONG).show();
            context.startActivity(new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
            Log.d(TAG, "  ");
            break;
        default:
            break;
        }
    }
}
2、当該放送受信者を登録する.AndroidManifast.xmlに登録または動的登録
AndroidManifast.xmlに登録:
        <receiver 
            android:name=".SMSReceiver">
            <intent-filter android:priority = "2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
動的登録:
一般的にonResume()メソッドでregisterReceiverメソッドを呼び出し、onPauseメソッドでunregisterReceiverメソッドを呼び出す
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        mSmsReceiver2 = new SMSReceiver2();
        registerReceiver(mSmsReceiver2, intentFilter);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mSmsReceiver2);
    }
注意:
1.ライフサイクルは10秒程度で、onReceive()内で10秒を超えることをすると、ANR(Application No Response)プログラムに応答しないエラーメッセージが表示され、比較的時間のかかる作業を完了する必要がある場合は、Intentをサービスに送信することで、サービスで完了する.BroadcastReceiverのライフサイクルが短いため、サブスレッドがまだ終了していない可能性があります.BroadcastReceiverは先に終了します.BroadcastReceiverが終了すると、BroadcastReceiverが存在するプロセスは、システムがメモリを必要とする場合に優先的に殺されやすくなります.これは、空のプロセス(アクティブなコンポーネントがないプロセス)であるためです.宿主プロセスが殺されると、動作中のサブスレッドも殺される.サブスレッドで解決するのは信頼できません
2.動的登録ブロードキャスト受信機のもう一つの特徴は、登録用のActivityがオフになると、ブロードキャストが無効になることです.静的登録は、デバイスがオンである限り、ブロードキャスト受信機もオンである限り、ブロードキャスト受信機がオフになることを心配する必要はない.つまり、app自体が起動していなくても、このapp購読のブロードキャストはトリガー時に機能します(しかし、私は2台の携帯電話でテストしてもそうではありません...)