Android四大组件之Broadcast(学习笔记)
BroadcastReceiver
发送,把信息装入到一个Intent对象
通过调用相应的方法将Intent对象以广播的方式发送出去
sendBroadcast();
sendOrderBroadcast();
sendStickyBroadCast();
service只有10s所以不能使用子线程
使用BroadcastReceiver的方法:
发送:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action,Category)装入一个Intent对象,然后通过调用Context.sendBrocast(),sendOrderBroadcast()或者sendStickyBroadcast()方法,把Intent对象以广播的方式发送出去。
接受:
当Intent发送之后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法
BroadcastReceiver的静态注册,在Mainifest中注册
<receiver android:name=".BC2"> <intent-filter> <action android:name="BC_ONE"> </action> </intent-filter> </receiver>
BroadcastReceiver所对应的广播分两类:
普通广播和有序广播。
普通广播:通过Context.sendBroadcast()方法来发送,它是完全异步的。
所有的receivers(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
这种方式效率更高,但是BroadcastReceiver无法使用setResult系列、getResult系列及abort(中止)系列API
在有序广播中可以阻断广播
优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
然后传给下一个接收者,
下一个接收者通过Bundle bundle = new getResultExtras(true)可
以获取上一个接收者存入的数据
可以设置优先级确定哪个Broadcast首先收到广播
MainActivity中的代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * Broadcast的动态注册 * */ IntentFilter intentFilter=new IntentFilter("BC_ONE");//action BC1 bc1=new BC1(); registerReceiver(bc1,intentFilter); } //设定点击事件 public void on_Click(View view){ switch (view.getId()){ case R.id.button: /*在intent中放入所要传播的信息,putExtra,放入一个Map类的数据 * 通过getExtra得到所放入的信息 * 通过在Intent中放入action中,传播广播 * */ Intent intent=new Intent(); intent.putExtra("msg","这是一个普通的广播"); intent.setAction("BC_ONE"); sendBroadcast(intent); break; case R.id.button2: Intent intent2=new Intent(); intent2.putExtra("msg","这是一个有序的广播"); intent2.setAction("BC_ONE"); //设置有序广播 sendOrderedBroadcast(intent2,null); default: break; } } @Override protected void onDestroy() { super.onDestroy(); } }
第一个BroadcastReceiver
public class BC1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { BC1 bc1=new BC1(); String s=intent.getStringExtra("msg"); System.out.println("输出数据1"+s); /*在有序广播中可以阻断广播 * 优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中, * 然后传给下一个接收者, * 下一个接收者通过Bundle bundle = new getResultExtras(true)可 * 以获取上一个接收者存入的数据 * 可以设置优先级确定哪个Broadcast首先收到广播 * */ // abortBroadcast(); Bundle bundle=new Bundle(); bundle.putString("test","广播处理的数据"); setResultExtras(bundle); } }
第二个BroadcastReceiver
public class BC2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String s=intent.getStringExtra("msg"); System.out.println("输出数据2"+s); Bundle bundle=getResultExtras(true); String s1=bundle.getString("test"); System.out.println("得到的处理结果是"+s1); } }
BC1的注册是动态注册,一般来说动态注册的接收广播要早于静态注册的,在收到有序广播后可以进行修改或者阻拦,通过setResultExtras放入bundle数据,在要接收广播的下个
BroadcastReceiver中设置getResultExtras是否为true,为true的话就接收bundle数据。