Android本地广播
Android中使用的广播一般是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
为了能够简单地解决广播的安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用 程序发出的广播,这样所有的安全性问题就都不存在了。 另外发送本地广播比发送系统全局广播更加高效。
本地广播的用法并不复杂,主要就是使用了一个 LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法。看下面的代码:
1 public class MainActivity extends Activity { 2 private IntentFilter intentFilter; 3 private LocalReceiver localReceiver; 4 private LocalBroadcastManager localBroadcastManager; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 //获取LocalBroadcastManager 12 localBroadcastManager = LocalBroadcastManager.getInstance(this); 13 14 Button button = (Button) findViewById(R.id.button); 15 button.setOnClickListener(new View.OnClickListener() { 16 @Override 17 public void onClick(View v) { 18 Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); 19 localBroadcastManager.sendBroadcast(intent); // 发送本地广播 20 } 21 }); 22 23 //注册广播接收器 24 intentFilter = new IntentFilter(); 25 intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); 26 localReceiver = new LocalReceiver(); 27 localBroadcastManager.registerReceiver(localReceiver, intentFilter); 28 } 29 30 @Override 31 protected void onDestroy() { 32 super.onDestroy(); 33 34 //注销广播接收器 35 localBroadcastManager.unregisterReceiver(localReceiver); 36 } 37 38 /** 39 * 自定义广播接收器 40 */ 41 class LocalReceiver extends BroadcastReceiver { 42 @Override 43 public void onReceive(Context context, Intent intent) { 44 Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show(); 45 } 46 } 47 }
另外还有一点需要说明,本地广播是无法通过静态注册的方式来接收的。其实这也完全 可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地 广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。
Do not be evil