安卓如何每次重启开机后只执行一次代码

安卓如何每次重启开机后只执行一次代码 - Wesley’s Blog

安卓如何每次重启开机后只执行一次代码:

方法一、开机广播

比较普遍的一个方法,但可能接收延迟或者被禁止接收。

方法二、设置一个非 persist 属性作为标记,重启后系统自动清除

受 selinux 管控,第三方应用无权限执行。

方法三、使用/proc/sys/kernel/random/boot_id 作为标记

相当于内核准备的一张 「本次开机身份证」

  • 每次重启都会变化一次
  • 在同一次开机过程中是稳定不变的

非常适合作为标记

    private const val TAG = "BootUtil"
    private const val PREF = "boot_util_prefs"

    fun current(context: Context): String {
        kotlin.runCatching {
            val text = File("/proc/sys/kernel/random/boot_id").readText().trim()
            if (text.isNotEmpty()) return text
        }
        kotlin.runCatching {
            val cnt = Settings.Global.getInt(context.contentResolver, Settings.Global.BOOT_COUNT)
            return "boot_count_$cnt"
        }
        return "unknown_boot"
    }

    fun runOnce(context: Context, block: () -> Unit) {
        val marker = current(context).also {
            Log.d(TAG, "current boot marker: $it")
        }
        val prefs = context.getSharedPreferences(PREF, Context.MODE_PRIVATE)
        val doneKey = "boot_once_$marker"
        val done = prefs.getBoolean(doneKey, false)
        if (!done) {
            block()
            prefs.edit {
                clear()
                putBoolean(doneKey, true)
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值