次の質問があります。
BroadcastReceiverを受信するときに電話機能を完全にオーバーライドすることは可能ですか? たとえば、SMS を受信し、その SMS が通知領域に表示されないようにすることはできますか?
ありがとう
次の質問があります。
BroadcastReceiverを受信するときに電話機能を完全にオーバーライドすることは可能ですか? たとえば、SMS を受信し、その SMS が通知領域に表示されないようにすることはできますか?
ありがとう
時々。放送の種類によって異なります。次のドキュメントをBroadcastReceiver
参照してください。
受信できるブロードキャストには、次の 2 つの主要なクラスがあります。
- 通常のブロードキャスト (Context.sendBroadcast で送信) は完全に非同期です。ブロードキャストのすべてのレシーバーは未定義の順序で、多くの場合同時に実行されます。これはより効率的ですが、レシーバーがここに含まれる結果または中止 API を使用できないことを意味します。
- 順序付きブロードキャスト (Context.sendOrderedBroadcast で送信) は、一度に 1 つのレシーバーに配信されます。各レシーバーが順番に実行されると、結果を次のレシーバーに伝達したり、ブロードキャストを完全に中止して他のレシーバーに渡さないようにしたりできます。レシーバーが実行される順序は、一致するインテント フィルターの android:priority 属性で制御できます。同じ優先順位のレシーバーは任意の順序で実行されます。
SMS はたまたま順序付けられたブロードキャストであるため、この場合に を呼び出しても、優先度abortBroadcast
の低い他の受信者は呼び出されません。これは、優先度が最も高い場合にのみ機能しますが、これを保証することは実際には不可能ですが、非常に高い優先度を設定するだけで妥当な仕事を行うことができます。おそらく9000 以上が適切かもしれません。ドキュメントには 1000 以上のものを使用しないように書かれていますが、これはシステムが常にブロードキャストを処理できるようにするためです。ただし、あなたの場合、システムがブロードキャストを処理するのを本当に止めたいと思っています。
はい、以下のコードのように BR を定義するだけで可能です。abortBroadcast();
他のBRのonReceivesをさらに呼び出すことができないように、レシーバーからメソッドを呼び出すようにしてください。
<receiver android:name=".SMSReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
許可
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
ただし、同じことをしている他のアプリがあり、Broadcast が中止された可能性があるため、常に動作するとは限りません。そのため、onReceive でさえトリガーされない可能性があります。