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