一、广播接收者
实际生活中,电台用于发送广播,收音机用于接收广播。
Android系统中,内置了很多系统级别的广播,例如手机开机完成后会发送一条广播,电池电量不足时会发送一条广播等。
Android系统中提供了广播接收者BroadcastReceiver,广播接收者的作用就是接收来自系统或其他应用程序的广播,并作出回应。

广播(Broadcast)是一种运用在应用程序之间传递消息的机制。
广播接收者(BroadcastReceiver)是用来过滤、接收并响应广播的一类组件。
广播接收者可以监听系统中的广播消息,在不同组件之间进行通信。
二、广播接收者创建与注册
要使用广播接收者接收其他应用程序发出的广播,先要在本应用中创建广播接收者并进行注册。
1、创建广播接收者
public class MyBroadcastReceiverextendsBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
………
}
}
注册广播有两种方式,常驻型广播与非常驻型广播。
1、注册常驻型广播
常驻型广播是当应用程序关闭后,如果接收到其他应用程序发出的广播,那么该程序会自动重新启动。常驻型广播在清单文件中注册。
<receiver android:name="cn.itcast.MyBroadcastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
2、注册非常驻型广播
非常驻型广播依赖于注册广播的组件的生命周期,例如,在Activity中注册广播接收者,当Activity销毁后广播也随之被移除。这种广播事件在代码中注册。
MyBroadCastReceiver receiver = new MyBroadCastReceiver();
String action = "android.provider.Telephony.SMS_RECEIVED";
IntentFilterintentFilter = new IntentFilter(action);
registerReceiver(receiver, intentFilter);
非常驻型广播可以在onDestory()方法中解除广播,具体代码如下:
unregisterReceiver(receiver);
三、案例—IP拨号器
广播接收者在Android系统中应用非常广泛,例如拨打长途电话时使用的IP拨号器,就是通过广播接收者实现的。接下来就通过一个案例来实现这个IP拨号器。

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et_ipnumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入IP号码" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/et_ipnumber"
android:layout_centerHorizontal="true"
android:onClick="click"
android:text="设置IP号码" />
</RelativeLayout>
OutCallReceiver.java
public class OutCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 获取拨打的电话号码
String outcallnumber = getResultData();
// 创建SharedPreferences对象,获取该对象中存储的IP号码
SharedPreferences sp = context.getSharedPreferences("config",
Context.MODE_PRIVATE);
String ipnumber = sp.getString("ipnumber", "");
// 将IP号码添加到外拨电话的前面
setResultData(ipnumber + outcallnumber);
}
}
MainActivity.java
public class MainActivity extends Activity {
private EditText et_ipnumber;
private SharedPreferences sp; // 用于保存文件的
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_ipnumber = (EditText) findViewById(R.id.et_ipnumber);
// 创建SharedPreferences对象
sp = getSharedPreferences("config", MODE_PRIVATE);
// 从sp对象中获取存储的IP号码,并将号码显示到et_ipnumber控件中
et_ipnumber.setText(sp.getString("ipnumber", ""));
}
// "设置IP拨号按钮"的点击事件
public void click(View view) {
// 获取用户输入的IP号码
String ipnumber = et_ipnumber.getText().toString().trim();
// 创建Editor对象,保存用户输入的IP号码
Editor editor = sp.edit();
editor.putString("ipnumber", ipnumber);
editor.commit();
Toast.makeText(this, "设置成功", 0).show();
}
}

