标签:
下面通过短信拦截器来介绍短信中的广播
在布局文件中可以设置需要拦截的号码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="25sp" android:text="需要拦截的号码"/> <EditText android:id="@+id/phoneNum" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/sure" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:text="确认"/> </LinearLayout>
在Activity中获取数据并保存到本地的xml数据库中
package xidian.dy.com.chujia; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { SharedPreferences sp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sp = getSharedPreferences("hate", Context.MODE_PRIVATE); Button button = (Button) findViewById(R.id.sure); if(button != null) button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText et = (EditText) findViewById(R.id.phoneNum); if(et != null){ sp.getString("num", et.getText().toString()); Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show(); } } }); } }
package xidian.dy.com.chujia; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.provider.Telephony; import android.telephony.SmsMessage; import android.util.Log; /** * Created by dy on 2016/7/11. */ public class SmsReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //短信的信息封装在Intent中 Bundle bundle = intent.getExtras(); Object[] objects = (Object[]) bundle.get("pdus"); SmsMessage sms; int currentApiVversion = Build.VERSION.SDK_INT; //拿到广播中的所有短信(有可能短信太长在发送时被拆分成多条进行发送) for (Object obj : objects) { if(currentApiVversion >= Build.VERSION_CODES.LOLLIPOP) sms = SmsMessage.createFromPdu((byte[])obj, Telephony.Sms.Intents.SMS_RECEIVED_ACTION); else sms = SmsMessage.createFromPdu((byte[])obj); Log.i(this.getClass().getName(), sms.getOriginatingAddress()); Log.i(this.getClass().getName(), sms.getMessageBody()); //广播拦截 //来自1243的短信将会被拦截掉 if(sms.getOriginatingAddress().equals("1243")){ abortBroadcast(); } } } }
短信的格式比较复杂(号码+信息),所以被存储在intent对象中。由于考虑的API level的问题这里需要做版本判断。调用abortBroadcast后广播将直接被销毁。
在清单文件中需要开启短信接受权限,因为广播接受者也有优先级问题(-1000~1000),所以我们应该将我们的拦截器优先级设置为最高(1000)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xidian.dy.com.chujia"> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="主界面"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".SmsReciever"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony_SMS_RECIEVED"/> </intent-filter> </receiver> </application> </manifest>
在Android4.0之后如果APP被安装了但从来没被用户启动过,或者是用户自己手动杀死APP进程,则系统不会去主动启动APP中的广播接受者来接受广播。
标签:
原文地址:http://www.cnblogs.com/xidongyu/p/5661490.html