LocalBroadcastManager。 它来自Android 的support包,类名是android.support.v4.content.LocalBroadcastManager,是用来在同一个应用内的不同组件间发送Broadcast的 当上一个实例在用这个资源的时候,由于用户的行为新建一个实例需要立马使用这个资源,那么就需要把上一个实例给停了, 看到这里大家肯定会想到使用 单利模式啊,使用static变量啊,使用同步方法啊,等等, 我的意思是想说使用 LocalBroadCastManager 都是一个视频,但是只能有一个同时在播放,并且用户点击了一个播放没有关闭的情况下,继续点击另外的播放,需要自动把上面的暂停了,并且保存相关状态(记录位置,暂停进度条,显示暂停图标等等), 在这样的背景下,使用LocalBroadCastManager private boolean mIsPause = false; private Context context; public String path; public static String time; LocalBroadcastManager
一.前言:BroadcastReceiver安全问题 对单个应用程序而言BroadcastReceiver是存在安全性问题的,为了解决这个问题LocalBroadcastManager就随之出现了。 二.什么是LocalBroadcastManager LocalBroadcastManager也称为局部通知管理器,是Android Support包提供了一个工具,用于在同一个应用内的不同组件间发送 (安全) 特点: 本地广播没有静态注册的方法 使用:与全局广播十分类似 具体见上文Android全局广播 动态注册不同的地方:注册调用的方法不同 注册时候调用的是LocalBroadcastManager localBroadcastManager; private IntentFilter intentFilter; private LocalReceiver localReceiver ()获得实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); initView();
context变成了LocalBroadcastManager的单一实例 注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册 的实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); //步骤3:设置接收广播的类型 intentFilter.addAction (android.net.conn.CONNECTIVITY_CHANGE); //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); //取消注册应用内广播接收器 localBroadcastManager.unregisterReceiver 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;
/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例 注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager 的实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); //步骤3:设置接收广播的类型 intentFilter.addAction (android.net.conn.CONNECTIVITY_CHANGE); //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); //取消注册应用内广播接收器 localBroadcastManager.unregisterReceiver 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context; 7.
android.content.Context import android.content.Intent import android.content.IntentFilter import androidx.localbroadcastmanager.content.LocalBroadcastManager class ReceiverActivity : AppCompatActivity() { private lateinit var localBroadcastManager: LocalBroadcastManager 发送广播 在需要发送广播的Activity中,可以通过LocalBroadcastManager发送广播消息。 import android.content.Intent import androidx.localbroadcastmanager.content.LocalBroadcastManager class SenderActivity : AppCompatActivity() { private lateinit var localBroadcastManager: LocalBroadcastManager
使用方法: //注册 networkReceiver = new NetworkReceiver(); localBroadcastManager = LocalBroadcastManager.getInstance ")); // 发送消息 localBroadcastManager.sendBroadcast(Intent); // 注销 localBroadcastManager.unregisterReceiver (networkReceiver); LocalBroadcastManager源码导读 为什么要导读LocalBroadcastManager源码呢? 其实是想让读者们知道LocalBroadcastManager使用并不是Binder机制来完成通信的。 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;
方案2:使用App应用内广播(LocalBroadcastManager类) App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。 使用封装好的 LocalBroadcastManager 类使用方式上与全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将参数的 context 变成了 LocalBroadcastManager 注意:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册。 LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this); //4:调用LocalBroadcastManager 4.对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context
其实实现很简单就是通过 LocalBroadcastManager 来对广播进行管理。 下面我们就来列几个方法就可以了 LocalBroadCastManager localBroadCastManager = LocalBroadCastManager.getInstance(this) // 获取实例 // 发送广播的时候 Intent intent = new Intent("com.broadcst.syd"); localBroadCastManager.senBroadCast 注册广播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.broadcst.syd"); localBroadCastManager.registerReceiver (localReceiver,intentFilter); // 取消注册 localBroadCastManager.unregisterReceiver(localReceiver); 其实和之前动态注册发送都是一样的
/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例 注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager 的实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); //步骤3:设置接收广播的类型 intentFilter.addAction (android.net.conn.CONNECTIVITY_CHANGE); //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); //取消注册应用内广播接收器 localBroadcastManager.unregisterReceiver 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context; 7.
context变成了LocalBroadcastManager的单一实例 注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册 的实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); //步骤3:设置接收广播的类型 intentFilter.addAction (android.net.conn.CONNECTIVITY_CHANGE); //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); //取消注册应用内广播接收器 localBroadcastManager.unregisterReceiver 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context; --
android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v4.content.LocalBroadcastManager MainActivity"; private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; private NetworkChangeReceive networkChangeReceive; @Override super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //接收本地的广播 localBroadcastManager = LocalBroadcastManager.getInstance(this); Button button = (Button) findViewById(R.id.button
LocalBroadcastManager.sendBroadcast 广播只能在应用程序内部进行传递,并且广播接收器也只能接收到来自本应用程序发出的广播。 (getApplicationContext()) .registerReceiver(mLocalReceiver1, makeIF()); LocalBroadcastManager.getInstance (getApplicationContext()) .unregisterReceiver(mLocalReceiver1); LocalBroadcastManager.getInstance (getApplicationContext()) .unregisterReceiver(mLocalReceiver2); LocalBroadcastManager.getInstance 要收到本地广播,同样需要LocalBroadcastManager来注册接收器。 可以把本地广播看成是一个局部的,App内的广播体系。
方法中注册 unregisterReceiver : 注销接收器,一般在onStop或者onPause方法中注销 进程内广播与进程间广播 如果广播是在应用之内使用,即不需要跨进程,可以考虑使用LocalBroadcastManager 进程内广播,推荐使用LocalBroadcastManager类下的registerReceiver和unregisterReceiver方法,代码示例如下: //注册接收器 LocalBroadcastManager.getInstance (this).registerReceiver(guestReceiver, filter); //注销接收器 LocalBroadcastManager.getInstance(this).unregisterReceiver new GuestReceiver(); IntentFilter filter = new IntentFilter("com.example.exmbrdlife.fragment"); LocalBroadcastManager.getInstance (this).registerReceiver(guestReceiver, filter); } @Override public void onStop() { LocalBroadcastManager.getInstance
本地广播 通过系统LocalBroadcastManager发送,只能在当前应用内接收。相对于其他类型广播而言,安全性高&效率高。 本地广播只能通过LocalBroadcastManager动态注册。 5、LocalBroadcastManager实现原理 LocalBroadcastManager虽然使用和普通广播没有太大差别,但是原理却是完全不同。 LocalBroadcastManager内部维护了mReceivers和mActions两个HashMap, mReceivers 是接收器和IntentFilter的对应表,主要作用是方便在unregisterReceiver
源码分析 我们下面来看下LocalBroadcastManager的源码: https://android.googlesource.com/platform/frameworks/support/+/ android-support-lib-19.1.0/v4/java/android/support/v4/content/LocalBroadcastManager.java 先来看下LocalBroadcastManager mInstance; public static LocalBroadcastManager getInstance(Context context) { synchronized (mLock) { if (mInstance == null) { mInstance = new LocalBroadcastManager( LocalBroadcastManager所发送的广播action,只能与注册到LocalBroadcastManager中BroadcastReceiver产生互动。
**LocalBroadcastManager.sendBroadcast 广播只能在应用程序内部进行传递,并且广播接收器也只能接收到来自本应用程序发出的广播。 (getApplicationContext()) .unregisterReceiver(mLocalReceiver1); LocalBroadcastManager.getInstance (getApplicationContext()) .unregisterReceiver(mLocalReceiver2); LocalBroadcastManager.getInstance ); intentFilter.addAction(Intent.ACTION_TIME_CHANGED); return intentFilter; } 使用LocalBroadcastManager 要收到本地广播,同样需要LocalBroadcastManager来注册接收器。 可以把本地广播看成是一个局部的,App内的广播体系。
</intent-filter> //优先级 abortBroadcast(); //截断 本地广播: localBroadcastManager = LocalBroadcastManager.getInstance intentFilter = new IntentFilter(); intentFilter.addAction("com....."); myReceriver = new MyReceriver(); localBroadcastManager.registerReceiver (myReceriver, intentFilter); Intent intent = new Intent("com..."); localBroadcastManager.sendBroadcast (intent); //发送本地广播 localBroadcastManager.unregisterReceiver(myReceiver); 总结 有关内容就到这里了,本篇介绍了四大组件中的广播组件的知识点
Toast.makeTest(context,String.format("%sReceived",s),Toast.LENGTH_SHORT).show(); } 敏感信息泄露漏洞:修复 修复后代码,使用LocalBroadcastManager.sendBroadcast Intent intent = new Intent("my-sensitive-event"); intent.putExtra("event","this is a test event"); LocalBroadcastManager.getInstance broadcast -a android.intent.action.PACKAGE_FULLY_REMOVED -d package:com.wumii.android.mimi 权限绕过漏洞:修复 推荐使用呢LocalBroadcastManager 使用LocalBroadcastManager。
intentFilter = new IntentFilter(); intentFilter.addAction("my.broadcast.faqian2"); //拿到LocalBroadcastManager 对象,对固定的Receiver进行注册,成为本地广播接收者 LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance (MainActivity.this); localBroadcastManager.registerReceiver( myBroadCastReceiver, intentFilter ); localBroadcastManager.registerReceiver(myBroadCastReceiver2, intentFilter); } 注意: 1 发送广播 LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcastSync(intent);//发送
LocalBroadcastManager 类的 getInstance() 方法获取的实例调用。 本地广播主要是使用了一个 LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法。 为了解决这个问题 LocalBroadcastManager 就应运而生了。 LocalBroadcastManager 是 Android Support 包提供了一个工具,用于在同一个应用内的不同组件间发送 Broadcast。 LocalBroadcastManager 也称为局部通知管理器,这种通知的好处是安全性高,效率也高,适合局部通信,可以用来代替 Handler 更新 UI 1.9.4 广播的安全性 Android