短信防火墻
- 系統(tǒng)發(fā)送短信廣播時(shí),是怎么把短信內(nèi)容存入廣播中的,我們就怎么取出來(lái)
- 如果短信過(guò)長(zhǎng),那么發(fā)送會(huì)拆分多條短信發(fā)送,那么短信廣播中就會(huì)包含多條短信.
- 4.0之后,廣播接收者所在進(jìn)程如果從來(lái)沒(méi)啟動(dòng)過(guò),那么廣播接收者則不會(huì)生效.
- 4.0之后,如果系統(tǒng)自動(dòng)關(guān)閉廣播接收者所在進(jìn)程,再?gòu)V播action匹配時(shí),系統(tǒng)會(huì)啟動(dòng)該廣播接收者所在進(jìn)程,如果是用戶(hù)自己關(guān)閉,則此進(jìn)程會(huì)凍結(jié),直到用戶(hù)自己手動(dòng)啟動(dòng)該進(jìn)程.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("接收到短信111");
//短信內(nèi)容是封裝在intent
Bundle bundle = intent.getExtras();
//以 pdus為鍵值,取出一個(gè)object數(shù)組,數(shù)組中的每一個(gè)元素,都是一條短信
Object[] objectses = (Object[]) bundle.get("pdus");
//拿到廣播中的所有短信
for (Object object : objectses) {
// 通過(guò)pdus來(lái)構(gòu)造短信
SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
//發(fā)送的號(hào)碼
System.out.println(sms.getDisplayOriginatingAddress());
//內(nèi)容
System.out.println(sms.getMessageBody());
String phone = sms.getDisplayOriginatingAddress();
if(phone.equals("110")){
//阻止其他的廣播接收者收到這條廣播
abortBroadcast();
}
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yhb.smsfilter">
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".receiver.SMSReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
</application>
</manifest>
短信防火墻要點(diǎn)
廣播接收者的優(yōu)先級(jí): android:priority="1000" 取值范圍: -1000-1000 1000為最高
-
短信廣播action,android已經(jīng)主動(dòng)屏蔽,代碼中不會(huì)提示,只能死記:
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>