命令APP_CMD_SAVE_STATE的用途是什么?

时间:2016-12-31 22:04:02

标签: android android-activity android-ndk

每当应用程序失去焦点时(无论是通过点击菜单按钮,还是通过进入空闲状态),都会发送APP_CMD_SAVE_STATE命令。

在本机活动(https://developer.android.com/reference/android/app/NativeActivity.html)的Android API文档中显示的示例中,当发送此特定命令时,它们会在android_app内保存某种“状态”。

    // (...)
    switch (cmd) {
    case APP_CMD_SAVE_STATE:
        // The system has asked us to save our current state.  Do so.
        engine->app->savedState = malloc(sizeof(struct saved_state));
        *((struct saved_state*)engine->app->savedState) = engine->state;
        engine->app->savedStateSize = sizeof(struct saved_state);
        break;
    // (...)

如果你查看他们的代码,savedState只是一个持有值的结构。首先,我认为每当我们失去焦点时,我们需要保存对我们的应用程序至关重要的每一个值,否则价值观将全部变得腐败或类似的东西(是的可怕!)

我通过删除上面的代码片段来运行一个简单的测试,幸运的是没有任何改变,我的结构的值在重新获得焦点后保持不变,即使没有保存它们。

所以我想知道这个命令的目的是什么?这是重要的事情吗?

1 个答案:

答案 0 :(得分:0)

当您的应用失去焦点时会发送 APP_CMD_SAVE_STATE 命令。目的是不仅可以暂停您的应用程序,而且如果系统必须终止应用程序以获取一些资源(例如可用 RAM),则该应用程序可以在用户下次返回时无缝恢复。 <块引用>

如果您查看他们的代码,savedState 只是一个保存值的结构体。

是的,从 Native Activity 的角度来看,它只是一个结构体。但是这个结构在通过 JNI 调用的 ANativeActivity_onCreate() 函数中传递给 Android(通常它是在 SDK 的 android_native_app_glue.c 中实现的,如果需要,您可以更改或替换)。因此,Android 将在管理应用时处理数据。

<块引用>

我通过删除上面的代码片段运行了一个简单的测试,幸运的是没有任何改变,即使没有保存它们,我的结构体的值在重新获得焦点后保持不变。

您的测试太软:) 尝试打开 Recents screen 并从那里关闭您的活动:点按 × 按钮或关闭所有命令。效果将是杀死应用程序,您现在应该会发现您的数据已被擦除,除非您使用保存-恢复机制。