一、广播分类
1.标准广播
没有顺序的广播,完全异步,几乎会同步收到广播,效率高,不能被截断。
2.有序广播
有顺序的广播,只有前面的广播接收器接受完毕(同一时刻只有一个广播接收器能收到消息),后面的广播接收器才能收到。可以设置优先级(优先级高的将会先收到广播消息)。先收到消息的广播接收器可以截断广播,使后面的广播接受器无法再收到。
二、注册广播的方式
1.动态注册(在代码中注册)
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private MyReceiver receiver;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//过滤出需要监听的广播
intentFilter = new IntentFilter();
intentFilter.addAction("---换成需要监听的广播内容---");
//创建接收器实例
receiver = new MyReceiver ();
//注册广播
registerReceiver(receiver,intentFilter);
btn = (Button) findViewById(R.id.click_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent("---注册自定义的广播逻辑---");
sendBroadcast(intent);
//发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
//sendOrderedBroadcast(intent,null);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册(这里很重要)
unregisterReceiver(receiver);
}
//这里是一个内部类集成广播接收器,当然也可以是单独的一个文件(在onReceive中完成接收到广播需要操作的逻辑)
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
}
2.静态注册(在AndroidManifest.xml中注册)
1).AndroidManifest.xml内容
<receiver android:name=".MyBroadcastReceiver">
<!--priority可以设置优先级-->
<intent-filter android:priority="100">
<!--action中是自定义的广播逻辑-->
<action android:name="com.example.keven.MY_BROADCAST"/>
</intent-filter>
</receiver>
2).MyBroadcastReceiver继承自BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received from MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
3).代码中再通过事件触发
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent("com.example.keven.MY_BROADCAST");
sendBroadcast(intent);
//发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
//sendOrderedBroadcast(intent,null);
}
});
三、本地广播
之前发送和接受的广播都属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,我们也可以接受来自于其他任何应用程序的广播。这样便存在安全隐患。为了解决这个问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接受来自本应用程序发出的广播。 优点:1.安全 2.效率高
本地广播主要使用了LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播的方法。(这里修改MainActivity文件进行说明,其实很简单,只是在注册、取消注册以及发送广播之前加上引用就行)
–>这里参照郭霖大神的《第一行代码》,个人感觉这是一本好书,适合初学者学习,推荐!!!郭霖大神的博客也是很好的学习的地方。—— [ 郭霖csdn博客 ]
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private MyReceiver receiver;
private Button btn;
private LocalReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取LocalBroadcastManager实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//过滤出需要监听的广播
intentFilter = new IntentFilter();
intentFilter.addAction("---换成需要监听的广播内容---");
//创建接收器实例
receiver = new MyReceiver ();
//注册广播
localBroadcastManager.registerReceiver(receiver,intentFilter);
btn = (Button) findViewById(R.id.click_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent("---注册自定义的广播逻辑---");
localBroadcastManager.sendBroadcast(intent);
//发送有序广播时使用sendOrderedBroadcast,同时在AndroidManifest中将需要先接收到的接受者优先级(priority)设置高一点,将会截断广播。
//sendOrderedBroadcast(intent,null);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册(这里很重要)
localBroadcastManager.unregisterReceiver(receiver);
}
//这里是一个内部类集成广播接收器,当然也可以是单独的一个文件(在onReceive中完成接收到广播需要操作的逻辑)
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
}