【问题标题】:What is the purpose of the command APP_CMD_SAVE_STATE ?命令 APP_CMD_SAVE_STATE 的目的是什么?
【发布时间】:2016-12-31 22:04:01
【问题描述】:

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

在 Android API 文档中显示的本机活动 (https://developer.android.com/reference/android/app/NativeActivity.html) 示例中,当发送此特定命令时,它们会在其 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 只是一个保存值的结构。首先,我认为每当我们失去焦点时,我们都需要保存对我们的应用程序重要的每一个值,否则这些值会全部损坏或类似的东西(是的,可怕!)

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

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

【问题讨论】:

    标签: android android-activity android-ndk


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2011-05-29
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多