gpt4 book ai didi

android - 为什么我的 Activity 会泄漏?

转载 作者:太空狗 更新时间:2023-10-29 16:22:26 27 4
gpt4 key购买 nike

我有一个具有 IntentFilter 和 BroadcastReceiver 的 Activity ,我在我的 onCreate() 中注册了它们。

IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);

但是在结束我的应用程序时,Logcat 说:

07-03 01:38:19.567: ERROR/ActivityThread(304): android.app.IntentReceiverLeaked: Activity com.intentservicetest5.IntentServiceTest5Activity has leaked IntentReceiver com.intentservicetest5.IntentServiceTest5Activity$MessageReceiver@44efe8a8 that was originally registered here. Are you missing a call to unregisterReceiver()?

但是我有

public void onDestroy(Bundle savedInstanceState){
unregisterReceiver(receiver);
}

为什么当我调用 unregisterReceiver() 时我的 Activity 仍然泄漏?

最佳答案

根据 Activity Lifecycle ,您的应用程序在 onPause() 之后的任何时间都可以终止在大多数设备上(任何低于 Android 3.0/API 级别 12 的设备),以及 onStop() 之后的任何时间在任何设备上。这意味着 onDestroy()不保证会被调用。那么,在 Activity 中注册和取消注册广播的最佳位置是 onResume()。和 onPause() ,分别是:

@Override
protected void onResume() {
super.onResume();

IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
}

@Override
protected void onPause() {
super.onPause();

unregisterReceiver(receiver);
}

请注意,正如@VipalShah 所指出的,您为 onDestroy() 使用了错误的签名.这就是为什么 unregisterReceiver()没有被调用。使用 @Override将帮助您解决此类问题。

还要注意 onPause() 之间的对称性和 onResume()是故意的。如果您查看上面链接的 Activity 生命周期文章,您会看到 onResume()在初始启动期间调用,而不仅仅是在从暂停中恢复时调用。所以只需要在这里注册直播,不需要在onCreate()里面注册。 .

最后,请注意,为简单起见,我使用了您的代码。实际上,您可能希望在 onCreate() 中设置 IntentFilter 和 MessageReceiver , 然后调用 registerReceiver()onResume() .

更新:另外一条重要说明。根据 Implementing the lifecycle callbacks :

Your implementation of these lifecycle methods must always call the superclass implementation before doing any work.

这里很多人都在显示调用super.onWhatever()在方法的末尾而不是在开始。

关于android - 为什么我的 Activity 会泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11304450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com