- 广播的两种类型
-
标准广播(Normal broadcasts) : 是一种完全异步执行的广播,在广播发出后,所有的广播接收器几乎的都会在同一时刻接收到这条广播信息。这种广播的效率会比较高,但同时也就意味着广播是无法截断的。
-
有序广播(Ordered broadcasts): 是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,这就意味着,任一能够接受这条广播的接收器,可以中途截断它,不让这条广播继续传递下去。
- 注册广播的两种方式
- 动态注册,即在代码中注册
public class MainActivity extends Activity{
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyReceiver();
registerReceiver(myReceiver,intentFilter); //注册广播
}
//在onDestroy()中取消注册广播
@Override
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(myReceiver);
}
//自定义广播接收器
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,"Network change",
Toast.LENGTH_SHORT).show();
}
}
Tips:当网络状态发生变化时,系统发出的广播值为 “android.net.conn.CONNECTIVITY_CHANGE"
- 静态注册,即在AndroidManifest.xml中添加广播接收器能够接收的广播信息
public class MyReceiver extends Activity{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,"Complete",
Toast.LENGTH_SHORT).show();
}
}
然后在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
后在 application 中添加如下信息:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Tips: Android系统启动完成后会自动发出一条值为 "android.intent.action.BOOT_COMPLETED"的广播.
.3. 动态注册和静态注册的比较
动态注册的广播接收器可以自由的控制注册和注销,在灵活性方便有很大的优势,但是也存在一个缺点,即必须在程序启动之后才能接收广播,因为注册的逻辑是写在onCreate()方法中的。如果想要让程序在不启动的情况下就能够接受广播,就可以使用静态注册。
.4. 发送广播
- 发送标准广播
Intent intent = new Intent("com.example.test.BROADCAST_RECEIVER");
sendBroadcast(intent);
Tips: com.example.text.BROADCAST_RECEIVER 是自定义的广播值,可定义特定的广播接收器去接受它,并处理相应逻辑。
- 发送有序广播
Intent intent = new Intent("com.example.test.BROADCAST_RECEIVER");
sendOrderedBroadcast(intent,null);
Tips:
sendOrderedBroadcast() 方法接受两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,一般传入null就可以了。
另外,可在intent-filter标签中利用android:priority属性给广播接收器设置优先级。还可以通过 abortBroadcast() 方法截断广播,不让其再传递下去。
.5. 使用本地广播
为了使我们发送的一些关键性广播不被其他应用程序截获,或者防止其他的应用程序不停地向我们的广播接收器里发送垃圾广播,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且也只能接受来自本应用程序发出的广播,保证了程序的安全性。
public class MainActivity extends Activity{
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.send);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("com.example.test.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentrFilter();
intentFilter.addAction("com.example.test.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
@Override
protected void onDestroy(){
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,"Local Receiver",
Toast.LENGTH_SHORT).show();
}
}
}
发送本地广播的优势:
- 可以明确知道正在发送的广播只能在本程序中,不会发生信息泄露
- 其他的程序无法对本程序发送广播,因此不会出现安全隐患。
- 发送本地广播比发送全局广播更加高效。
网友评论