【发布时间】: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