什么是广播?
广播是Android四大组件之一,是一种全局的监听器,用于监听系统全局的广播消息。
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了。Android中的广播机制就和这个差不多的道理。
首先,我们需要在布局文件中写EditText和Button俩个控件,代码如下:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入广播发送内容:"
android:id="@+id/et_main_content"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="sender"
/>
1、在Android中我们要发送广播内容是一个Intent,这个Intent可以携带我们要传送的数据。在Android中则是通过sendBroadcast这个方法来发送。代码如下:
private EditText et_main_content;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_content = (EditText) findViewById(R.id.et_main_content);
intent = new Intent();
//设置action行为
intent.setAction("android_broadcast.955");
}
public void sender(View view){
//得到广播内容
String content=et_main_content.getText().toString();
//携带数据
intent.putExtra("data",content);
//发送广播(默认的是无序广播)//sendOrderedBroadcast();有序广播
sendBroadcast(intent);
//黏性广播(需要权限)
//sendStickyBroadcast(intent);
}
2、写一个类继承BroadCastReceiver,重写BroadCastReceiver的一个onReceive()方法只有发送广播的action和接收广播的action相同,接受者才能接受这个广播。
代码如下:
public class MyRecevied extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if("android_broadcast.955".equals(intent.getAction() )){//绑断字符串的广播名是否等于intent接收的广播名
String data=intent.getStringExtra("data");//拿到广播发送的内容
Log.i("test","接收了你的表白:"+data);
}
}
}
另外,我们还需要在清单文件(AndroidMainfest.xml)中配置广播接收者。在<application>节点中增加<receiver>节点,增加name的属性;增加<intent-filter>节点,指定<action>节点。
代码如下:
<receiver android:name=".MyRecevied">
<intent-filter>
<action android:name="android_broadcast.955"></action>
</intent-filter>
</receiver>
使用动态注册广播,特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
private MyRecevier myRecevier;
private IntentFilter filter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myRecevier = new MyRecevier();
filter = new IntentFilter();
filter.addAction("android_broadcast.955");
}
@Override
protected void onResume() {
super.onResume();
//注册动态广播
registerReceiver(myRecevier,filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
unregisterReceiver(myRecevier);
}
总结:
动态广播与静态广播的区别:
<1、在清单文件(AndroidMainfest.xml)中配置,为静态广播;通过Java代码去注册而不是在清单文件里面去配置,为动态广播。
<2、优先级,动态广播优先级比静态广播要高。
<3、生存周期,静态广播生存期比动态广播要长,因为静态很多但是用来对系统时间进行监听,而动态广播会随context的终止而终止。(动态广播当应用程序关闭后接收不到广播发送者的消息,而静态广播可以接收得到。)
* 使用粘性广播可以让动态广播当应用程序关闭后会接受到广播发送者的消息。
sendStickyBroadcast(intent);//粘性广播
切记,在清单文件(AndroidMainfest.xml)中需要增加黏性广播的权限。
<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>