前面发送和接受的广播全部属于系统全局广播,即发出的光比可以被其他任何应用程序接收到,并且我们也可以接收来自其他任何应用程序的广播,这样很容易引起安全性问题。
本地广播主要就是使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法
LocalBroadcastManager localBroast;
LocalReceiver
LocalReceiver receiver
;
oncreate(....){
localBroast
=
LocalBroadcastManager.getInstance(this);
....onclick(...){ Intent intent=new Intent("com.example.broadcast.LOCAL_BROADCAST");
localBroast.sendBroadcast(intent);//发送本地广播
}});
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("
com.example.broadcast.LOCAL_BROADCAST
");
//注册本地广播监视器
receiver
=new LocalReceiver();
localBroast.registerReceiver(
receiver,
intentFilter
);
}
@Override
onDestory(){
localBroast.unregisterReceiver(
receiver
);
}
class
LocalReceiver extends BroadcastReceiver{
onReceiver(.....){....}
}
*********************************************************************************
本地广播无法通过静态注册来接受。静态注册的目标是未启动程序也能接收到广播,而发送本地广播的时候,我们的程序肯定是已经启动了,完全不需要静态注册了。
- public class MainActivity extends AppCompatActivity {
- private IntentFilter intentFilter;
- private LocalReceiver localReceiver;
- //本地广播数据类型实例。
- private LocalBroadcastManager localBroadcastManager;
- @Override
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.activity_main);
- //获取本地广播实例。
- localBroadcastManager=LocalBroadcastManager.getInstance(this);
- Button button=(Button)findViewById(R.id.button);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent=new Intent("com.example.tangyi.receiver5.LOCAL_BROADCAST");
- //发送本地广播。
- localBroadcastManager.sendBroadcast(intent);
- }
- });
- //新建intentFilter并给其action标签赋值。
- intentFilter=new IntentFilter();
- intentFilter.addAction("com.example.tangyi.receiver5.LOCAL_BROADCAST");
- //创建广播接收器实例,并注册。将其接收器与action标签进行绑定。
- localReceiver=new LocalReceiver();
- localBroadcastManager.registerReceiver(localReceiver,intentFilter);
- }
- @Override
- public void onDestroy(){//在onDestroy()方法中取消注册。
- super.onDestroy();
- //取消注册调用的是unregisterReceiver()方法,并传入接收器实例。
- localBroadcastManager.unregisterReceiver(localReceiver);
- }
- class LocalReceiver extends BroadcastReceiver{
- @Override
- public void onReceive(Context context,Intent intent){
- Toast.makeText(context,"这是本地广播接收器",Toast.LENGTH_SHORT).show();
- }
- }
- }
本地广播好处是 :
发送的广播不会离开我的程序,不必担心机密数据泄漏。
其他程序无法将广播发送到我们程序的内部,不必担心会有安全漏洞的隐患。
更加高效
强制下线功能 需要先关闭掉所有的应用,然后回到登录页面。别忘了以前的ActivityCollector类用于管理所有的活动。
在点击事件中发送一条广播,在BaseActivity中添加这个广播接收器的代码和控制。
这里在onResume和onPause这两个生命周期函数,然后分别在这两个方法里注册和取消注册了广播接收器。
这是因为我们始终需要保证只有处于栈顶的活动才能接收到这条前置下线的广播,非栈顶的活动不应该也没有必要去接受这条广播,所以写在这里,当一个活动失去栈顶位置时就会自动取消广播接收器的注册