广播小组件

该代码定义了一个SafeBroadcastReceiver类,用于安全地注册和注销广播接收器。它使用AtomicBoolean来管理接收器的注册状态,防止重复注册或未注册。在接收到广播时,会调用提供的回调函数onBroadcastReceive。示例中还展示了如何初始化并注册一个监听特定权限限制广播的接收器。
摘要由CSDN通过智能技术生成
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)
    }

初始化注册:
在这里插入图片描述
解除注册
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值