import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Handler
import android.util.Log
import java.util.concurrent.atomic.AtomicBoolean
@Suppress("unused")
class SafeBroadcastReceiver(
private val intentFilter: IntentFilter,
private val logTag: String = LOG_TAG,
private val onBroadcastReceive: SafeBroadcastReceiver.(context: Context?, intent: Intent?, receiver: BroadcastReceiver) -> Unit
) {
companion object {
private const val LOG_TAG = "SafeBroadcastReceiver"
}
private val internalReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) = onBroadcastReceive(context, intent, this)
}
private val hasRegistered = AtomicBoolean(false)
private fun isSupportRegister(context: Context?): Boolean {
if (context == null) {
Log.i(logTag, "isSupportRegister: context is null, ignore")
return false
}
if (!hasRegistered.compareAndSet(false, true)) {
Log.i(logTag, "isSupportRegister: receiver has registered, ignore")
return false
}
return true
}
private fun isSupportUnregister(context: Context?): Boolean {
if (context == null) {
Log.i(logTag, "isSupportUnregister: context is null, ignore")
return false
}
if (!hasRegistered.compareAndSet(true, false)) {
Log.i(logTag, "isSupportUnregister: receiver has unregistered, ignore")
return false
}
return true
}
fun registerReceiver(context: Context?): Intent? {
if (!isSupportRegister(context)) {
return null
}
Log.d(logTag, "registerReceiver: ")
return context?.registerReceiver(internalReceiver, intentFilter)
}
fun registerReceiver(context: Context?, @Context.RegisterReceiverFlags flags: Int): Intent? {
if (!isSupportRegister(context)) {
return null
}
Log.d(logTag, "registerReceiver: ")
return context?.registerReceiver(internalReceiver, intentFilter, flags)
}
fun registerReceiver(context: Context?, broadcastPermission: String?, scheduler: Handler?): Intent? {
if (!isSupportRegister(context)) {
return null
}
Log.d(logTag, "registerReceiver: ")
return context?.registerReceiver(internalReceiver, intentFilter, broadcastPermission, scheduler)
}
fun registerReceiver(context: Context?, broadcastPermission: String?, scheduler: Handler?, @Context.RegisterReceiverFlags flags: Int): Intent? {
if (!isSupportRegister(context)) {
return null
}
Log.d(logTag, "registerReceiver: ")
return context?.registerReceiver(internalReceiver, intentFilter, broadcastPermission, scheduler, flags)
}
fun unregisterReceiver(context: Context?) {
if (!isSupportUnregister(context)) {
return
}
Log.d(logTag, "unregisterReceiver: ")
context?.unregisterReceiver(internalReceiver)
}
}
广播小组件的类
小组件的使用
ACTION_PERMISSION_RESTRICTED_WHEN_STEALTH_MODE = "oplus.intent.action.PERMISSION_RESTRICTED_WHEN_STEALTH_MODE"
private const val EXTRA_RESTRICTED_PERMISSION_TYPE = "oplus.intent.extra.RESTRICTED_PERMISSION_TYPE"
private val mPermissionBroadcastReceiver = SafeBroadcastReceiver(
IntentFilter(ACTION_PERMISSION_RESTRICTED_WHEN_STEALTH_MODE), TAG
) { _, intent, _ ->
val permissionType = intent?.getIntExtra(EXTRA_RESTRICTED_PERMISSION_TYPE, 0)
LogUtil.i(LogUtil.TAG_VOLUME, TAG, "PermissionBroadcastReceiver.onReceive: permissionType = $permissionType")
showPermissionWindow(permissionType)
}
初始化注册:
解除注册