1、广播是一种运用在应用程序之间传递消息的机制,广播接收者是用来过滤、接受并响应广播的一类组件。
1.1广播分为普通广播和有序广播,下面分别图解:
普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。
有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。(后面还有有序广播的深入补充)
2、广播的创建与接收(普通广播)
步骤2.1:创建一个FirstBroadcast类继承自BroadcastReceiver 实践证明这个接收者不需要初始化,会自动接收发出的广播
public class FirstBroadcast extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "this is first Broadcast", 3000).show();
//abortBroadcast(); //这个是后面用来实现有序广播截断后面的广播的
}
}
2.2在Manifest中对这个广播接收者进行注册
//这个是你的类的全路径
//priority是优先级,优先级高的广播接收者先执行
//这个是Intent隐式意图的匹配项
intent-filter>
receiver>
2.3发送广播
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Intent intent = new Intent("My_Broadcast");
sendBroadcast(intent, null);
break;
default:
break;
}
}
小结:
1、是用intent意图启动广播,那么还可以用intent.putExtra(name, value)方法来添加信息
2、原理是我们创建了一个BroadcastReceiver类,通过intent发送一条名为My_Broadcast的广播,同时我们在manifest中声明的相匹配,于是我们的MyBroadcast接收到了这个广播。
3、有序广播的理解
3.1
我们刚刚创建了一个广播接收器,下面再创建一个项目来创建第二个广播接收器,
注意上面的第一个广播接收器的优先级是90,下面这个是100,所以会优先被下面这个接收器收到。
public class AnotherBroadcast extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "This is AnotherBroadcast", 3000).show();
}
}
同时也要在manifest中声明receiver
intent-filter>
有序广播的sendbroadcast方法
sendBroadcast(intent, null);
这个时候点sendBroadcast会一次输出”This is AnotherBroadcast”,”this is first Broadcast”。
为了证明有序广播是可以截断的,我们可以把FirstBroadcast中的//abortBroadcast();取消注释,这个方法是停止广播的意思,再点按钮发送广播我们会发现只输出了”This is AnotherBroadcast”,然后就截断了。
4、本地广播
这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,增加了安全性。
那么怎么创建本地广播呢?
步骤:(对应的序号会标在代码后面)
4.1创建一个本地广播的管理者
4.2声明intentFilter
4.3实例化接收者
4.4注册广播管理者
public class MainActivity extends Activity {
private LocalBroadcastManager localBroadcastManager;
private IntentFilter intentFilter;
private LocalBroadcast localBroadcast;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("LocalBroadcast");
localBroadcastManager.sendBroadcast(intent);
}
});
localBroadcastManager = LocalBroadcastManager.getInstance(this);//4.1
intentFilter = new IntentFilter("LocalBroadcast");//4.2
// intentFilter.addAction();
localBroadcast = new LocalBroadcast();//4.3
localBroadcastManager.registerReceiver(localBroadcast, intentFilter);//4.4 参数分别是广播接受者和intentFilter
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
localBroadcastManager.unregisterReceiver(localBroadcast);
}
public class LocalBroadcast extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Toast.makeText(MainActivity.this, "This is LocalBroadcast", 2000).show();
}
}
}
先这样吧,也是刚学,自己总结的一点通俗易懂的经验,后面会学习补充