什么是广播:android四大组件之一
一种全局的监听器,用于监听系统全局的广播消息
系统大部分消息都以广播的形式发布,比如开机启动完成的消息,收到短信的消息,打进打出电话的消息
andorid系统每次启动完成会向外广播一条信息,告诉所有人启动完成了,只有继承自Broadcast的类能捕捉到这些系统消息,捕捉到信息该干嘛干嘛
如何实现自定义广播:我们拿广播电视台来做个比方许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了
创建广播发送者:1.创建Intent用于启动Broadcast:intnet.setAction(String action)指定广播的频率
intent.put(String key,String message)指定广播发送出去的消息
2.调用sendBroadcast()或者sendOrderdBroadcast方法启动指定的广播类
当发出Broadcast Intent以后,使用匹配该Intent的Broadcast都可能被启动
创建广播接受者:1.写一个类继承自BroadcastReceiver
2.重与onReceive(Context context,Intent intent)方法intnet.getStringExtra(String key);获取广播中的消息
3.注册广播接受者:静态注册:在清单文件中注册:1.在application节点中添加一个receiver节点
2.添加android:name属性 值为类的权路径
3.添加Intent-filter节点 指定action节点 相当于是指定接受的广播的频率
广播接收器的执行不依赖本应用程序的运行
动态注册:在应用程序被启动执行时注册,相对应应用程序如果退出,广播的注册必须要取消
注册:contextregisterReceiver(reciever,filter);
取消注册:contextunregisterReceiver(reciever)
有序广播:普通广播不能中断,所有监听这个广播的都能收到信息,有序广播可以中断。 中断广播abortBroadcast();
优缺点:优点:按优先级的不同,优先Receiver课对数据进行数据进行处理,并传给下一个Receiver
通过abortBroadcast课终止广播的传播
缺点:效率低
优先接收到Broadcast的Receiver课通过setResuitExtras(Bundle)方法将处理结果存入Broadcast中
粘性广播:粘性广播主要为了解决,在发送完广播之后,动态注册的接受者,也能够接受到广播
先发送一个广播,我的接受者是通过程序中的某个按钮动态注册的,如果不是粘性广播,我注册完接受者肯定无法接收到广播了,这是通过发送粘性广播就能能够在我动态注册接受者后也能收到广播
发送粘性广播还需要发现粘性广播的权限:uses-permission android:name=
“android.permission.BROADCAST_STICKY“
生命周期:广播接受者的生命周期是非常短暂的,在接受到广播时候创建,onBeceive()方法结束后销毁
注意事项:广播接收器的执行和Activity以及Service的执行一样都是由Android的Main主线程负责的
所以为了避免对主线程的UI绘制工作产生严重干扰,广播的onReceive方法中不能做非常复杂的操作
因为这个方法的执行时间会被限定到10秒之内,否则就会报ANR(Application Not Response)异常
package zking.com.android_21_1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class MyReceiver1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的名字
String action=intent.getAction();
if ("zking.com.android_21_sender.Hug".equals(action)){
//获取广播内容
//String content=intent.getStringExtra("content");
Bundle bundle= getResultExtras(true);
String content=bundle.getString("newContent");
Log.i("text","广播1号"+content);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zking.com.android_21_1">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--注册:广播接受者
动态注册:使用java代码配置
静态注册:在XML文件中配置
-->
<!-- <receiver android:name=".MyReceiver1">
<intent-filter>
<action android:name="zking.com.android_21_sender.Hug"></action>
</intent-filter>
</receiver>-->
</application>
</manifest>
package zking.com.android_21_2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
/**
* Created by Administrator on 2017/7/11 0011.
*/
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的名字
String action=intent.getAction();
if ("zking.com.android_21_sender.Hug".equals(action)){
//获取广播内容
String content=intent.getStringExtra("content");
Log.i("text","广播2号"+content);
//判断
if(content.contains("免费")){
//不传播
abortBroadcast();
}
//改变广播的内容
//设置结果
Bundle bundle=new Bundle();
bundle.putString("newContent",content+",开玩笑的");
setResultExtras(bundle);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zking.com.android_21_2">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver2">
<intent-filter
android:priority="1000"
>
<action android:name="zking.com.android_21_sender.Hug"></action>
</intent-filter>
</receiver>
</application>
</manifest>
package zking.com.android_21_sender;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_main_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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("zking.com.android_21_sender.Hug");
//指定广播内容
intent.putExtra("content",content);
//发送无序广播
//sendBroadcast(intent);
//发送无序粘性广播
//sendStickyBroadcast(intent);
//发送有序广播
sendOrderedBroadcast(intent,null);
}
}