BroadcastReceiver(广播接收器)本质上就是一个全局监听器,用于监听系统全局的广播消息,它拥有自己的进程,只要存在与之匹配的Intent被广播出来,就会被激发。值得注意的是Android8要求启动BroadcastReceiver的Intent必须是显性(设置Action和package)。
广播分为普通广播(sendBroadcast)和有序广播(sendOrderedBroadcast)。
- 普通广播:完全异步,可以在同一时刻被所有接收者接收到。
- 有序广播:按照预先声明的优先级依次接受Broadcast。优先级声明在<intent-filter.../>元素的 android:priority属性中,数越大优先级别越高,取值范围为-1000-1000,也可以调用 setpriority()设置优先级。级别高的可以对消息进行处理再进行发送,也可以使用 abortBroadcast()进行终止。
系统广播(静态、动态注册)和本地广播(动态广播)。
- 普通广播的使用:(静态注册)
public class MainActivity extends AppCompatActivity {
ReceiverTest1 receiverTest1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//普通广播
EditText editText_input = findViewById(R.id.et_test);
Button button = findViewById(R.id.btn_test);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String content = editText_input.getText().toString();
Intent intent = new Intent();
intent.setAction("com.example.intent.send_msg");
intent.setPackage("com.example.broadcastreceivertest");
intent.putExtra(Constants.KEY_CONTENT,content);
sendBroadcast(intent);
}
});
}
}
在AndroidManifest中设置:
<receiver android:name=".ReceiverTest1"
android:exported="false">
<intent-filter>
<action android:name="com.example.intent.send_msg"/>
</intent-filter>
</receiver>
ReceiverTest1中的代码:
public class ReceiverTest1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(KEY_CONTENT);
Toast.makeText(context, "ReceiverTest1"+s, Toast.LENGTH_SHORT).show();
setResultExtras(bundle);
}
}
运行结果如下:
2. 有序广播的使用:(静态注册)
将上述普通广播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可。
在AndroidManifest中设置:
<receiver android:name=".ReceiverTest1"
android:exported="false">
<intent-filter android:priority="20">
<action android:name="com.example.intent.send_msg"/>
</intent-filter>
</receiver>
<receiver android:name=".ReceiverTest2"
android:exported="false">
<intent-filter android:priority="0">
<action android:name="com.example.intent.send_msg"/>
</intent-filter>
</receiver>
ReceiverTest1中的代码:
public class ReceiverTest1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(KEY_CONTENT);
Bundle bundle = new Bundle();
bundle.putString("first","放假了!");
Toast.makeText(context, "ReceiverTest1"+s, Toast.LENGTH_SHORT).show();
setResultExtras(bundle);
}
}
ReceiverTest2中的代码:
public class ReceiverTest2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(KEY_CONTENT);
Bundle bundle = getResultExtras(true);
String b = bundle.getString("first");
Toast.makeText(context, "ReceiverTest2"+s+b, Toast.LENGTH_SHORT).show();
}
}
运行结果如下:
3.动态广播
java文件:
//动态广播
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.SEND_MSG");
MessageReceiver receiverTest1 = new MessageReceiver();
registerReceiver(receiverTest1,intentFilter);
String content = editText_input.getText().toString();
Intent intent=new Intent("com.example.SEND_MSG");
intent.putExtra("message",content);
sendBroadcast(intent);
}
});
动态注册需要在onDestory里面注销:
@Override
protected void onDestroy() {
super.onDestroy();
if(receiverTest1 != null){
this.unregisterReceiver(receiverTest1);
}
}
MessageReceiver中的内容:
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, "hahah"+action, Toast.LENGTH_SHORT).show();
String content = intent.getStringExtra("message");
Toast.makeText(context, "xixixi"+content, Toast.LENGTH_SHORT).show();
}
}
AndroidManifest中注册的内容:
<receiver android:name=".MessageReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.example.SEND_MSG"/>
</intent-filter>
</receiver>
运行结果如下: