【问题标题】:Android Kotlin: running a recursive function with an interval within the broadcast receiver is not workingAndroid Kotlin:在广播接收器内运行具有间隔的递归函数不起作用
【发布时间】:2025-11-21 18:20:05
【问题描述】:

我正在构建一个 Android 应用程序。在我的应用程序中,即使应用程序每 15 秒左右关闭一次,我也需要在后台运行任务。我正在为此使用广播接收器。

这是我的广播接收器。

class RegisterReceiversScheduler: BroadcastReceiver() {
    private lateinit var handler: Handler
    private lateinit var context: Context

    private fun getHandler(): Handler {
        if (! this::handler.isInitialized) {
            this.handler = Handler();
        }

        return this.handler
    }

    override fun onReceive(context: Context?, intent: Intent?) {
        this.context = context as Context
        registerReceivers()
    }

    private fun registerReceivers() {
        Toast.makeText(this.context, "I am here", Toast.LENGTH_SHORT).show()

        getHandler().postDelayed({
            this.registerReceivers()
        }, 5000)
    }
}

如你所见,我每五秒就会发送一条消息。

这就是我在我的活动中注册广播接收器的方式。

var registerReceiversFilter = IntentFilter()
        registerReceiversFilter.addAction("com.forkthecoup.com22222.RegisterReceiversScheduler")
        var registerReceivers = RegisterReceiversScheduler();
        registerReceiver(registerReceivers, registerReceiversFilter)

我在 AndroidManifest.xml 文件中添加了这个。

<receiver android:name=".RegisterReceiversScheduler">
            <intent-filter>
                <action android:name="com.forkthecoup.com22222.RegisterReceiversScheduler" ></action>
            </intent-filter>
        </receiver>

当我运行该应用程序时,它不会发送任何消息。然后我检查 logcat,我看到以下错误。

2021-02-25 15:42:04.628 13463-13463/com.forkthecoop.com22222 E/ActivityThread: Activity com.forkthecoop.com22222.MainActivity has leaked IntentReceiver com.forkthecoop.com22222.RegisterReceiversScheduler@3e221d4 that was originally registered here. Are you missing a call to unregisterReceiver()?
    android.app.IntentReceiverLeaked: Activity com.forkthecoop.com22222.MainActivity has leaked IntentReceiver com.forkthecoop.com22222.RegisterReceiversScheduler@3e221d4 that was originally registered here. Are you missing a call to unregisterReceiver()?
        at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1594)

错误基本上是说接收者已经注册了。如果是这样的话,我至少应该看到一次 toast 消息。但我没有看到它。我的代码有什么问题,我该如何解决?

【问题讨论】:

  • 广播接收器不适合做后台操作。为此,您可以在 Android 中使用服务

标签: android kotlin broadcastreceiver


【解决方案1】:

您可以使用前台服务来实现此功能。 https://medium.com/@jayd1992/foreground-services-in-android-e131a863a33d

【讨论】:

    【解决方案2】:

    我看不出您的代码有任何问题(但它完全违反了有关重复任务的 Android 准则)。您是否正在发送将触发您的接收器的 Intent 广播?

    在你的registerReceiver 方法之后,你可以试试这个:

    sendBroadcast(Intent("com.forkthecoup.com22222.RegisterReceiversScheduler"))

    另外,我建议您以这种方式初始化处理程序:

    private val handler by lazy { Handler(Looper.getMainLooper()) }
    

    并清理 getHandler() 方法

    顺便说一句,这回答了你的问题,但如果 Android 系统决定终止你的应用程序,它无论如何都会终止它

    【讨论】:

      最近更新 更多