Broadcast是Android四大組件之一,是一種廣泛運用的在應用程序之間傳輸信息的機制。最經典的舉例是:
“我們拿廣播電台來做個比方。我們平常使用收音機收音是這樣的:許許多多不同的廣播電台通過特定的頻率來發送他們的內容,而我們用戶只需要將頻率調成和廣播電台的一樣就可以收聽他們的內容了。Android中的廣播機制就和這個差不多的道理。”
電台發送的內容是語音,而在Android中我們要發送的廣播內容是一個Intent。這個Intent中可以攜帶我們要傳送的數據。
電台通過大功率的發射器發送內容,而在Android中則是通過sendBroadcast這個方法來發送。
用戶通過調整到具體的電台頻率接受電台的內容。而在Android中要接受廣播中的內容則是通過注冊一個BroadCastReceiver來接收的。只有發送廣播的action和接收廣播的action相同,接受者才能接受這個廣播。
我們拿代碼說話
IP撥號的實現
配置文件:
<receiver
android:name="com.iidcdut.ipcall.OutCallReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
onCreate裡面主要是對SharePrefence配置,設置撥號時候要加的IP,然後BroadcastReceiver裡面就是對要撥出去的號碼進行加IP操作。
復制代碼
public class MainActivity extends Activity {
private EditText edit_ipnumber;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_ipnumber = (EditText) findViewById(R.id.edit_ipnumber);
sp = getSharedPreferences("config", MODE_PRIVATE);
edit_ipnumber.setText(sp.getString("ipnumber", ""));
}
public void click(View view)
{
String ipnumber = edit_ipnumber.getText().toString();
Editor editor = sp.edit();
editor.putString("ipnumber", ipnumber);
editor.commit();
Toast.makeText(this, "設置OK", Toast.LENGTH_LONG).show();
}
}
復制代碼
廣播接收:
復制代碼
public class OutCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceive 發現新外撥電話");
String number = getResultData();
System.out.println("number="+number);
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String ipnumber = sp.getString("ipnumber", "");
String newnumber = ipnumber + number;
setResultData(newnumber);
}
}
復制代碼
短信攔截
像360的app裡面就有垃圾短信攔截的功能,其實就是通過廣播實現的。
配置文件:
<receiver android:name="com.yydcdut.smslistener.SmsReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
廣播裡面:
復制代碼
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到短信");
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu : pdus)
{
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
String body = smsMessage.getMessageBody();
String sender = smsMessage.getOriginatingAddress();
System.out.println("body"+body);
System.out.println("sender"+sender);
abortBroadcast();
}
}
}