Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用finishAfinity()不会破坏android应用程序或活动。活动';即使重新启动应用程序,s数据仍然存在_Java_Android_Android Activity - Fatal编程技术网

Java 调用finishAfinity()不会破坏android应用程序或活动。活动';即使重新启动应用程序,s数据仍然存在

Java 调用finishAfinity()不会破坏android应用程序或活动。活动';即使重新启动应用程序,s数据仍然存在,java,android,android-activity,Java,Android,Android Activity,这是一个巨大的Android编程问题/bug 调用finishafinity()不会关闭我的应用程序。 以下事实证明了这一点: 1.Android Studio调试器仍然会说“应用程序正在运行”,即使应用程序从屏幕上消失,我回到手机主屏幕。 2.“重新启动”应用程序时,初始活动的数据成员的值与应用程序“关闭”之前的值保持不变。 3.如果我在finishafinity()之后直接调用System.exit(0),则关机工作正常,数据成员重置为初始默认值。 这个问题还有更大的含义!在启动另一个

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

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

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

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

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


这个问题还有更大的含义!在启动另一个活动b后,在活动a中调用finish()时,如果返回到活动a,则未重置为默认值的数据成员仍然是旧值。

这是我困惑的,因为我来自C++,当一个类被破坏,它是<强>实际上< /强>被破坏,与它相关联的所有内存都被完全释放。

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

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
        }
    }
}
Android没有“关闭我的应用程序”的概念。只有安卓
活动
。VM的对象生命周期与活动生命周期之间没有连接;Android可以自由地跨创建/销毁边界重复使用您的
活动
对象实例。简而言之,你不能假设Android会构造一个新的
活动
对象来处理生命周期事件

您需要管理自己的状态。例如,您可能希望在
onCreate()
中清除它们,以便在重新创建活动时重置它们。请注意,我并不想知道你想用什么逻辑来解决这个问题,我只是举个例子

finishafinity()
不用于“关闭应用程序”。它用于从当前任务中删除属于特定应用程序的大量活动(可能包含属于多个应用程序的活动)

即使您完成了应用程序中的所有
活动
,托管应用程序的操作系统进程也不会自动消失(就像您调用
System.exit()
时那样)。安卓系统最终会在你的进程开始运行时终止你的进程。你无法控制这一切(这是故意的)

如果进程附加了调试器,这也可以防止进程被Android终止,因为调试器会在进程中保留活动对象

你谈到“数据成员”没有被清理,并且你声称C++的工作方式不同。事实上,那不是真的。您的“数据成员”被声明为

static
。它们不是实例变量,而是类变量。它们只存在一次(不是在类的每个实例中),它们在类加载时被创建和初始化,并且在类卸载之前它们不会被销毁(在Android上不会发生这种情况)。C++的行为完全相同。
您可以尝试使用实例变量而不是类变量来解决问题。

OK。所以你要说的是,当一个活动被回收时,非静态变量以某种方式被神奇地重新初始化,而静态变量当然不是,静态变量也不会被销毁,因为Android回收了“类”。那就清楚多了!我增加了你的答复。谢谢。@zdanman嗯……这其实不是魔法。这就是java和C++设计的方式。您应该仔细阅读“实例变量”和“类变量”之间的区别。此外,Android不会“回收”活动。它根据需要创建新实例(创建新实例时实例变量都会初始化),并回收超出范围(已“完成”)的实例的内存然后被销毁。实际上,你可以用Android.os.Process.killprocess关闭一个应用程序,而这不是活动生命周期的一部分。如果你像那样杀死你的进程,Android对此一无所知,并且它是对后果的警告。