这是一个巨大的Android编程问题/bug。
调用finishAffinity()不会关闭我的应用程序。
以下事实证明了这一点:
对这个问题有更大的影响!在启动另一个ActivityB之后,当我在ActivityA中调用finish()时,如果我返回到ActivityA,那么数据成员没有被重置为默认值仍然是旧值。
这让我感到困惑,因为我来自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
}
}
}
发布于 2016-09-20 18:27:42
finishAffinity()
不用于“关闭应用程序”。它用于从当前任务(可能包含属于多个应用程序的Activity
)中移除属于特定应用程序的许多Activity
。
即使您完成了应用程序中的所有Activity
,承载应用程序的OS进程也不会自动消失(就像调用System.exit()
时一样)。Android最终会杀死你的进程,当它开始的时候。你无法控制这件事(这是故意的)。
如果将调试器附加到进程,这还可以防止Android杀死进程,因为调试器将活动对象保存在进程中。
您谈到“数据成员”没有被清理,并声称这在C++中的工作方式不同。事实上,那不是真的。您的“数据成员”被声明为static
。它们不是实例变量,而是类变量。它们只存在一次(不是在类的每个实例中),它们是在类加载时创建和初始化的,直到类卸载(在Android上从未发生),它们才会被销毁。C++有着完全相同的行为。
您可以尝试使用实例变量而不是类变量来解决问题。
发布于 2016-09-19 22:55:17
Android没有“关闭我的应用程序”的概念。只有Android Activity
生命周期。在活动生命周期上,VM的对象生命周期之间没有任何联系;Android可以在创建/销毁边界上自由地重用您的Activity
对象实例。简而言之,您不能假设Android将构建一个新的Activity
对象来处理生命周期事件。
你需要管理你自己的州。例如,您可能希望在onCreate()
中清除它们,因此每当您的活动被重新创建时,它们都会被重置。请注意,我并不是假设知道您想要应用于这个问题的逻辑,我只是举一个例子。
https://stackoverflow.com/questions/39583184
复制相似问题