首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用finishAffinity()不会破坏安卓应用程序或活动。即使在重新启动应用程序时,活动的数据仍然保持不变

调用finishAffinity()不会破坏安卓应用程序或活动。即使在重新启动应用程序时,活动的数据仍然保持不变
EN

Stack Overflow用户
提问于 2016-09-19 22:45:24
回答 2查看 38.8K关注 0票数 17

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

调用finishAffinity()不会关闭我的应用程序。

以下事实证明了这一点:

  1. 仍然说,“应用程序正在运行”,即使应用程序从屏幕上消失了,我也回到了手机主屏幕。
  2. 当“重新启动”应用程序时,inital活动的数据成员的值与应用程序“关闭”前相同。
  3. 如果我在System.exit(0)之后直接调用finishAffinity(),那么关闭将正常工作,数据成员将被重置为其初始默认值。

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

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

在切换到新活动或试图退出应用程序时,要完全删除自己的活动似乎是不可能的。

代码语言:javascript
运行
复制
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
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-20 18:27:42

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

即使您完成了应用程序中的所有Activity,承载应用程序的OS进程也不会自动消失(就像调用System.exit()时一样)。Android最终会杀死你的进程,当它开始的时候。你无法控制这件事(这是故意的)。

如果将调试器附加到进程,这还可以防止Android杀死进程,因为调试器将活动对象保存在进程中。

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

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

票数 27
EN

Stack Overflow用户

发布于 2016-09-19 22:55:17

Android没有“关闭我的应用程序”的概念。只有Android Activity 生命周期。在活动生命周期上,VM的对象生命周期之间没有任何联系;Android可以在创建/销毁边界上自由地重用您的Activity对象实例。简而言之,您不能假设Android将构建一个新的Activity对象来处理生命周期事件。

你需要管理你自己的州。例如,您可能希望在onCreate()中清除它们,因此每当您的活动被重新创建时,它们都会被重置。请注意,我并不是假设知道您想要应用于这个问题的逻辑,我只是举一个例子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39583184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档