android - 命令 APP_CMD_SAVE_STATE 的目的是什么?

标签 android android-activity android-ndk

每次应用程序失去焦点(无论是通过点击菜单按钮手动,还是通过进入 idle )都会发送一个 APP_CMD_SAVE_STATE 命令。

在 native Activity (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只是一个保存值的结构。首先,我认为每当我们失去焦点时,我们都需要保存对我们的应用程序重要的每一个值,因为否则这些值都会变得损坏或类似的东西(是的,可怕!)

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

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

最佳答案

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

If you look in their code, savedState is just a struct holding values.


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

I run a simple test by removing the code snippet above, and fortunately nothing changed, the values of my struct stayed the same after regaining focus even without saving them.


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

关于android - 命令 APP_CMD_SAVE_STATE 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41411999/

相关文章:

Android gradle ndk jni build with external library & native debugging (ARToolkit)

android - 即使启用了 KEEP_AWAKE,Adobe AIR : Screen keeps dimming,

android - 响应 Android 中的偏好更新

java - Android Web 浏览器应用程序停止。无法开始 Activity

Android - 如果 Activity 是第一次加载(不使用 SharedPreferences),则阻止 onResume() 函数

Android Studio Cmake 构建错误 : invalid conversion between vector type

android - 如何使用 C 中的 'mmap' 命令分配特定的内存区域? (安卓NDK)

Android - 我应该在我的声明中添加什么作为我想要使用谷歌云服务的最低可接受版本?

android - Eclipse 和 Android NDK 在 JNI 之外的另一个文件夹中编译 C++ 代码

android - 模拟 SetOnTouchListener 或它在 xamarin 中的使用方式,参数必须是什么