1.概述
广播接收器不仅能接受来自系统的内容,也可以接受来自其他app的内容。广播分为标准广播和有序广播。
2.标准广播
一种完全异步执行的广播,在广播发出之后几乎所有的广播接收器都在同一时刻接受到广播信息。没有任何顺序可言。但这种广播无法被拦截。
基本的使用:重写onReceiver
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String s=intent.getStringExtra("key"); Toast.makeText(context,s+"--1",Toast.LENGTH_SHORT).show(); } }
<receiver android:name=".MyBroadcastReceiver"> <!-- 指定能够接收的广播类型 --> <intent-filter > <action android:name="aaaa" /> </intent-filter> </receiver>
Intent intent=new Intent(); intent.setAction("aaaa"); intent.putExtra("key","输入的value"); /** * 发送普通广播 */ MainActivity.this.sendBroadcast(intent);
3.有序广播
一种同步执行的广播,在广播发送出后,同一时刻只能有一个广播接收器能够收到这个广播,当这个广播接收器中的逻辑处理完毕后才会继续传递。优先级高德接收器先接收到广播,且前面的广播接收器还可以拦截广播,这样后面的广播接收器就接受不到广播了。(优先级相同时,按照注册次序接收广播)
优先级取值: -1000~1000(优先级低-->高)
示例:
注册2个广播接收器:
<receiver android:name=".MyBroadcastReceiver"> <!-- 指定能够接收的广播类型 --> <intent-filter android:priority="50"> <action android:name="aaaa" /> </intent-filter> </receiver> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name="aaaa"/> </intent-filter> </receiver>
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String s=intent.getStringExtra("key"); Toast.makeText(context,s+"--1",Toast.LENGTH_SHORT).show(); } }
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String s=intent.getStringExtra("key"); Toast.makeText(context,s+"---2",Toast.LENGTH_SHORT).show(); /** * 中断,只对有序广播起作用 */ abortBroadcast(); } }
Intent intent=new Intent(); intent.setAction("aaaa"); intent.putExtra("key","输入的value"); /** * 发送有序广播 */ sendOrderedBroadcast(intent, null);
如上,发送广播,只会执行 Toast.makeText(context,s+"---2",Toast.LENGTH_SHORT).show();
4.广播的动态注册:
上面在Xml配置文件中配置为静态注册,那么动态注册广播代码如下:
IntentFilter intentFilter;
MyReceiver myReceiver;
myReceiver=new MyReceiver(); intentFilter=new IntentFilter(); intentFilter.addAction("aaaa"); /** * 设置优先级 */ intentFilter.setPriority(100); registerReceiver(myReceiver,intentFilter);
5.本地广播
为了解决广播的安全性问题,Adnroid引入了一套本地广播机制。使用这个机制发出的广播只能在应用程序内部使用,并且广播接收器也只能接受本地发出的广播。主要的使用是引入了一个loaclBroadcastManager对广播进行管理。
public class MainActivity extends AppCompatActivity { Button btn; IntentFilter intentFilter; LocalReceiver localReceiver; LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager=LocalBroadcastManager.getInstance(this); /** * 注册本地广播 */ localReceiver=new LocalReceiver(); intentFilter=new IntentFilter(); intentFilter.addAction("aaaa"); localBroadcastManager.registerReceiver(localReceiver,intentFilter); btn= (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setAction("aaaa"); intent.putExtra("key","输入的value"); localBroadcastManager.sendBroadcast(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); } class LocalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String s=intent.getStringExtra("key"); Toast.makeText(context,s+"***",Toast.LENGTH_SHORT).show(); } } }