首先什么是广播:
android的广播概念和我们日常生活中的电台有相通之处,空气中有不同频段,不同电台的广播,而android系统中就有对应的电池的电量,来电,短信还有例如sd卡拔插等等这些广播的消息发出,这些消息就对应着用收音机调频时,不同电台的节目。而我们注册的广播就类似于我收听某个电台的节目,比如一个注册广播收听交通广播,另一个注册的广播收听音乐广播,那么怎么区分是交通广播还是音乐广播呢,这就要通过前一章提到的Intent的action来判断。
不多说上代码:
首先兴建一个项目定义为发送者anjie_android_20broatcast_sender来发送我们的广播
无序广播:
布局文件activity_main
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_Editext"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="send"
android:text="发送"
/>
java代码MainActivity.java
public class MainActivity extends AppCompatActivity {
private EditText main_Editext;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_Editext = (EditText) findViewById(R.id.main_Editext);
//实例化一个intent
intent = new Intent();
//设置广播名字(设置Action)
intent.setAction("android20_sender.955");
}
public void send(View view){
//得到文本数据
String content= main_Editext.getText().toString();
//intent携带数据
intent.putExtra("content",content);
//发送广播(无序)
sendBroadcast(intent);
}
}
发送者我们就写完了。
接受者01号:
兴建一个项目anjie_android_20broatcast_received01
兴建java类:Received01
自定义广播接收器需要继承基类BroadcastReceivre,并实现抽象方法onReceive(context, intent)方法。广播接收器接收到相应广播后,会自动回到onReceive(..)方法。默认情况下,广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。否则将因此ANR。一般情况下,根据实际业务需求,onReceive方法中都会涉及到与其他组件之间的交互,如发送Notification、启动service等。
public class Received01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断电台发送者是不是android20_sender.955
if ("android20_sender.955".equals(intent.getAction())){
//获取接收的数据
String content=intent.getStringExtra("content");
Log.i("test","01号接受者收到了广播:"+content);
}
}
}
配置清单文件 :AndroidManifest.xml
<!--配置广播接收者
1、在清单文件中配置(静态)
2、使用java代码配置(动态)
-->
<receiver android:name=".Received01">
<intent-filter>
<action android:name="android20_sender.955"></action>
</intent-filter>
</receiver>
接受者02号:
兴建一个项目anjie_android_20broatcast_received02
兴建java类:Received02
跟anjie_android_20broatcast_received02相同的操作这里就不说了……
运行三个项目看结果:
好了静态广播就成功了!
现在我们把Received02改为动态广播:
先把清单文件里面的 配置广播接收者 代码 删掉
通过java代码来配置:
在anjie_android_20broatcast_received02:MainActivity中重写onResume方法让他一启动就调用配置重点内容
public class MainActivity extends AppCompatActivity {
private Received02 received02;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
received02 = new Received02();
intentFilter = new IntentFilter();
intentFilter.addAction("android20_sender.955");
}
@Override
protected void onResume() {
super.onResume();
//动态注册广播
registerReceiver(received02,intentFilter);
}
//动态广播必须注销否则会报错
// 重写onDestroy方法
@Override
protected void onDestroy() {
super.onDestroy();
//注销动态广播
unregisterReceiver(received02);
}
}
运行结果:
由此看出:
动态广播的优先级高于静态
如果动态广播(Received02)退出 则不能接受广播
静态是否退出都能接受
有序广播:
我们只需要改一点
在发送者MainActivity中更改
//发送广播(有序)
sendOrderedBroadcast(intent,null);
有序广播优先级-1000~1000(无序没有)
两种方式:
清单文件配置 intent-filter 标签中添加android:priority=”999”
<intent-filter
android:priority="999"
>
java代码配置
取消广播传播 : abortBroadcast();
有序广播就可以了!
补充:
黏性广播(过时)作为了解 sendstickyBroadcast(intent) 黏性广播需要权限 <uses-permission android:name="android.permission.BROADCAST_STICKY">
常用广播:http://blog.csdn.net/anjiepursue/article/details/54914631