一.本地广播
2.1 基本概念
由于之前的广播都是全局的,所有应用程序都可以接收到,这样就很容易会引起安全性的问题,比如说我们发送一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播,这样所有的安全性问题就都不存在了。
2.2 核心用法
使用LocalBroadcastManager来管理广播:
- 调用LocalBroadcastManager.getInstance()来获得实例
- 调用xx.registerReceiver()来注册广播
- 调用xx.sendBroadcast()发送广播
- 调用xx.unregisterReceiver()取消注册
2.3 注意事项
- 本地广播无法通过静态注册来接收,相比起系统全局广播更加高效
- 在广播中启动activity的话,需要为intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,因为需要一个栈来存放新打开的activity。
- 广播中弹出AlertDialog的话,需要设置对话框的类型为:TYPE_SYSTEM_ALERT不然是无法弹出的。
二.代码之旅
使用一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播的接收器的方法,代码如下所示:
package com.nyl.orderlybroadcast; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity implements View.OnClickListener { private Button btnOrderlyBroadcast; 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); btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast); btnOrderlyBroadcast.setOnClickListener(this); } @Override public void onClick(View view) { Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver"); //发送本地广播 localBroadcastManager.sendBroadcast(intent); intentFilter = new IntentFilter(); intentFilter.addAction("com.nyl.orderlybroadcast.AnotherBroadcastReceiver"); localReceiver = new LocalReceiver(); //注册本地接收器 localBroadcastManager.registerReceiver(localReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); } private class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"收到本地广播",Toast.LENGTH_SHORT).show(); } } }
运行效果如下图:
好了,广播接收器的内容已经学完了,内容不是很多,所以接下来综合运用一下本章中所学到的知识来做一个强制下线的功能~~~~