gpt4 book ai didi

java - 调用 finishAffinity() 不会破坏 android 应用程序或 Activity 。即使重新启动应用程序, Activity 的数据仍然存在

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:55:01 31 4
gpt4 key购买 nike

这是一个巨大的 Android 编程问题/错误。

调用 finishAffinity() 不会关闭我的应用程序。
以下事实证明了这一点:

1. 即使应用程序从屏幕上消失并且我回到手机主屏幕,Android Studio 调试器仍然说“应用程序正在运行”。

2. 当“重新启动”应用程序时,初始 Activity 的数据成员的值与应用程序“关闭”之前的值保持相同。

3. 如果我在 finishAffinity() 之后直接调用 System.exit(0),则关闭会正常工作并且数据成员会重置为其初始默认值。


这个问题还有更大的影响!当我在启动另一个 ActivityB 后在 ActivityA 中调用 finish() 时,如果我回到 ActivityA 那么未重置为默认值的数据成员仍然是旧值。

这让我感到很困惑,因为我来自 C++,在 C++ 中,当一个类被销毁时,它就会被实际上销毁,并且与它相关的所有内存都被完全释放。

在切换到新 Activity 或尝试退出应用程序时让 Activity 完全删除自身似乎是不可能的。

public class Startup extends AppCompatActivity
{
private static int iStarted = 0;

............

@Override
protected void onActivityResult(int request, int result, Intent data)
{
super.onActivityResult(request, result, data);

if (request == RESULT_EULA_RETURNED)
{
// shutdown
finishAffinity(); // iStarted remains = 1
return;
}
}

..........

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

// perform startup
// even when restarted this remains = 1
if (iStarted == 0)
{
iStarted = 1; // this will stay = 1 until the application is manually killed via the CLOSE ALL method or via the debugger
}
}
}

最佳答案

finishAffinity() 不用于“关闭应用程序”。用于从当前任务中移除属于特定应用程序的多个Activity(可能包含属于多个应用程序的Activity)。

即使您完成了应用程序中的所有 Activity,托管您的应用程序的操作系统进程也不会自动消失(就像您调用 System.exit())。当 Android 绕过它时,它最终会杀死你的进程。您对此无法控制(这是故意的)。

如果您有一个附加到进程的调试器,这也可以防止进程被 Android 终止,因为调试器会在进程中保留 Activity 对象。

你谈到“数据成员”没有被清理,你声称这在 C++ 中的工作方式不同。事实上,事实并非如此。您的“数据成员”被声明为static。它们不是实例变量,它们是类变量。它们只存在一次(不是在类的每个实例中),它们在加载类时创建和初始化,并且它们在类被卸载之前永远不会被销毁(这在 Android 上永远不会发生)。 C++ 具有完全相同的行为。

您可以尝试使用实例变量而不是类变量来解决您的问题。

关于java - 调用 finishAffinity() 不会破坏 android 应用程序或 Activity 。即使重新启动应用程序, Activity 的数据仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583184/

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