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

标签 java android android-activity

这是一个巨大的 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/

相关文章:

android - 如何从调用的电话代码(例如#120)开始一个 Activity

java - 列出打包 war 中的文件

java - 更改 eclipse.ini 中的内存设置会导致无法创建 JVM

java - Spring RestTemplate & Jackson - 日期转换?

android - 在异步任务中关闭对话框时出现 IllegalArgumentException

android - 如何清除堆栈中的当前 Activity ?

java - 如何跨防火墙解析网页

android - GCM 演示不会在服务器和应用重启时接受消息

java - 缺少文件路径

c# - 如果达到最大连接数/ session 数,则 asp.net 重定向