Android四大控件之BroadcastReceiver
来源:互联网 发布:mysql as 规则 编辑:程序博客网 时间:2024/05/17 03:17
今天本人学了Android中BroadcastReceiver的相关知识,想和大家来一起分享分享。
BroadcastReceiver的意思就是“广播接收者”,用来接收来自系统和应用中的广播。
其实在我们还没有接触BroadcastReceiver之前就有用过广播,例如当网络改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作。
下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
在演示之前我们先创建一个demo为Sender(发送者)
在Sender这里,我们需要一个发送信息的界面,界面我就简单化了:
activity_main.xml
<EditText android:layout_width="match_parent" android:layout_height="wrap_conten" android:id="@+id/et_main_content" android:hint="请输入发送的内容"/><Button android:layout_width="match_parent" android:layout_height="wrap_conten" android:test="确定" android:onClick="send"
在mainactivity.Java中
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获得发送ID et_main_content = (EditText) findViewById(R.id.et_main_content); } public void send(View view){ String content=et_main_content.getText().toString(); Intent intent=new Intent(); //指定广播的名字;名字不能随便去必须是包名点你自己取一个名字 intent.setAction("com.smi.administrator.android_sender.Hug"); //指定广播内容 intent.putExtra("content",content); //发送无序广播 sendBroadcast(intent); //发送有序广播 //需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限 sendOrderedBroadcast(intent,null); }}
静态注册
静态注册是在MyReceiver01中的AndroidManifest.xml文件中配置的,MyReceiver02也是一样的<receiver android:name=".MyReceiver01" <intent-filter> <action android:name="com.smi.administrator.android_sender.Hug"> </intent-filter></receiver>
动态注册
在MyReceiver01中的MainActivity.Java代码实现,那么MyReceiver02也是一样的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver01 = new MyReceiver01();
intentFilter = new IntentFilter();
intentFilter.addAction("com.smj.administrator.android_sender.Hug");
intentFilter.setPriority(999);
}
@Override
protected void onResume() {
super.onResume();
//注册广播
registerReceiver(myReceiver01,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册 注销
unregisterReceiver(myReceiver01);
}
无序广播
普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
为了验证以上论断,我们新建俩个Receiver,分别为MyReceiver01,MyReceiver02
public class MyReceiver01 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取广播的名字 String action=intent.getAction(); if("com.smi.administrator.android_sender.Hug".equals(action)){ //获取广播内容 String content=intent.getStringExtra("content"); Log.i("test","广播接受者1号:"+content); } }}
public class MyReceiver02 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取广播的名字 String action=intent.getAction(); if("com.smi.administrator.android_sender.Hug".equals(action)){ //获取广播内容 String content=intent.getStringExtra("content"); Log.i("test","广播接受者2号:"+content); } }
有序广播
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。发送有序广播见在mainactivity.Java中的红色字体
下面是怎样接收有序广播:
静态注册的优先级:在xml中的<intent-filter>多了一个android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。
动态注册的优先级:在MainActivity.java代码中设置,见动态注册中的红色字体
注意:无序广播是不能设置优先级的
当然有序广播中还有一个这样的功能,改变广播中的内容
例如:改变MyReceiver02中的内容,但是不改变MyReceiver01,那MyReceiver02就得添加内容。
在MyReceiver02中设置:
public class MyReceiver02 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取广播的名字 String action=intent.getAction(); if("com.zking.administrator.g160628_android21_sender.Hug".equals(action)){ //获取广播内容 String content=intent.getStringExtra("content"); Log.i("test","广播接受者2号:"+content); //判断 if(content.contains("免费")){ //不传播 abortBroadcast(); } //改变广播的内容 //设置结果 Bundle bundle=new Bundle(); bundle.putString("newContent",content+",传递的内容有免费二字"); setResultExtras(bundle); } }
那么MyRecetity01就要怎样去拿去值:
public class MyReceiver01 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取广播的名字 String action=intent.getAction(); if("com.zking.administrator.g160628_android21_sender.Hug".equals(action)){ //获取广播内容 //String content=intent.getStringExtra("content"); //获取结果 Bundle bundle=getResultExtras(true); String content=bundle.getString("newContent"); Log.i("test","广播接受者1号:"+content); } }
还有最后一个功能:阻止广播传递
例如:MyReceiver02收到了一条信息,但是不想传递给MyReceiver01。
见上面的紫色字体
- Android四大控件之BroadcastReceiver
- Android四大控件之BroadcastReceiver
- android四大组件之BroadCastReceiver
- android 四大组件之 broadcastreceiver
- android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android 四大组件之 BroadcastReceiver
- Android四大组件之~~BroadcastReceiver
- Android 四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- Android四大组件之BroadcastReceiver
- android四大组件之BroadcastReceiver
- java.sql.DataTruncation: Data truncation at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagn异常
- 函数指针函数
- 线段树(3)
- splay tree 学习笔记
- java学习准备工作
- Android四大控件之BroadcastReceiver
- 【尚学堂之行——第三天】编写简单的Java程序
- JavaScript中常见的坑有哪些?
- 7/3作业:接口的作用:面向接口编程
- Python 高阶函数之 map()、reduce()、filter()
- 挖洞姿势:浅析命令注入漏洞
- 翻页功能的实现
- 微信小程序 调用支付jsapi时缺少参数:total_fee
- 位运算(1)