什么是广播
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。
我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,
而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了。
Android中的广播机制就和这个差不多的道理。
电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent。这个Intent中可以携带我们要传送的数据。
电台通过大功率的发射器发送内容,而在Android中则是通过sendBroadcast这个方法来发送(很形象的名字吧)。
只有发送广播的action和接收广播的action相同,接受者才能接受这个广播。
广播有什么用
1.实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。比如说拦截系统短信,拦截骚扰电话等等
2.起到了一个通知的作用,比如在service中要通知主程序,更新主程序的UI等。
如何实现广播
Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中静态注册。
程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。下面小编模拟一个简单的广播。
发送者
public void send(View view){
//得到广播内容
String content=et_main_content.getText().toString();
//发送广播
Intent intent=new Intent();
//设置广播的名字
intent.setAction("com.android_sender.FM90.5");
//设置广播内容
intent.putExtra("content",content);
sendBroadcast(intent);
}
接收者
xml中静态注册
public class MyReceived01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//得到广播名字
String name=intent.getAction();
if("com.android_sender.FM90.5".equals(name)){
//得到广播内容
String content=intent.getStringExtra("content");
Log.i("test","我是1号接受者,收到广播的内容:"+content);
}
}
}
<!--配置广播接受者
1.静态(在清单文件中进行配置)
2.动态(在java 代码中进行配置)
-->
<receiver android:name=".MyReceived01">
<intent-filter>
<action android:name="com.android_sender.FM90.5"></action>
</intent-filter>
</receiver>
java动态注册
public class MyReceived02 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//收消息
//得到广播名字
String name=intent.getAction();
if("com.android_sender.FM90.5".equals(name)){
//得到广播内容
String content=intent.getStringExtra("content");
Log.i("test","我是2号接受者,收到广播的内容:"+content);
}
}
}
public class MainActivity extends AppCompatActivity {
private MyReceived02 myReceived02;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceived02 = new MyReceived02();
intentFilter = new IntentFilter();
intentFilter.addAction("com.android_sender.FM90.5");
}
@Override
protected void onResume() {
super.onResume();
//注册广播(动态)
//必须取消注册
registerReceiver(myReceived02,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceived02);
}
}
动态广播和静态广播的区别
相同点
都能收到广播,都是无序的,
不同点
静态是在清单文件里写,退出应用程序任可以受到广播。而动态是在java代码中,退出应用程序不可以受到广播,动态优先级更高于静态。
当然广播还有无序广播,黏性广播,无序广播还有系统广播等,有兴趣的同学到网上搜搜就有了。这里就不再举例了。