调用finishAffinity()不会破坏Android应用程序或活动.即使重新启动应用,活动的数据仍然存在

zda*_*man 5 java android android-activity

这是一个巨大的Android编程问题/错误.

调用finishAffinity()不会关闭我的应用程序.
这可以从以下事实得到证明:

1.即使应用程序从屏幕上消失并且我又回到手机主屏幕,Android Studio调试器仍然会显示"应用程序正在运行".

2.当' 重新启动 '应用程序时,初始活动的数据成员的值保持与应用程序假定" 关闭 " 之前的值相同.

3.如果我在finishAffinity()之后直接调用System.exit(0),则关闭正常,数据成员将重置为其初始默认值. 对这个问题有更大的影响!当我打电话完成()ActivityA开始另一个后ActivityB,如果我回去ActivityA那么数据成员没有被重置为默认值仍然是旧值. 这一切混乱的,因为我来自C++在当一个类被销毁那么它是我ACTUALLY破坏,与之相关联的所有内存完全释放. 在切换到新活动或尝试退出应用程序时让活动完全删除自身似乎是不可能的.






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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 16

finishAffinity()不习惯"关闭应用程序".它用于Activity从当前任务中删除属于特定应用程序的Activity多个s (可能包含属于多个应用程序的s).

即使你完成了Activity应用程序中的所有s,托管你的应用程序的操作系统进程也不会自动消失(就像你打电话时那样System.exit()).Android最终会在它进入时终止你的进程.你无法控制这一点(这是故意的).

如果您有一个附加到该进程的调试器,这也可以防止该进程被Android杀死,因为调试器会在进程中保留活动对象.

您谈到"数据成员"没有被清理,并且您声称这在C++中的工作方式不同.实际上,那不是真的.您的"数据成员"已声明static.它们不是实例变量,而是类变量.它们只存在一次(不是在类的每个实例中),它们是在加载类时创建和初始化的,并且在卸载类之前它们永远不会被销毁(这在Android上永远不会发生).C++具有完全相同的行为.

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