每当应用程序失去焦点时(无论是通过点击菜单按钮,还是通过进入空闲状态),都会发送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
只是一个持有值的结构。首先,我认为每当我们失去焦点时,我们需要保存对我们的应用程序至关重要的每一个值,否则价值观将全部变得腐败或类似的东西(是的可怕!)
我通过删除上面的代码片段来运行一个简单的测试,幸运的是没有任何改变,我的结构的值在重新获得焦点后保持不变,即使没有保存它们。
所以我想知道这个命令的目的是什么?这是重要的事情吗?
答案 0 :(得分:0)
当您的应用失去焦点时会发送 APP_CMD_SAVE_STATE
命令。目的是不仅可以暂停您的应用程序,而且如果系统必须终止应用程序以获取一些资源(例如可用 RAM),则该应用程序可以在用户下次返回时无缝恢复。>
<块引用>
如果您查看他们的代码,savedState
只是一个保存值的结构体。
是的,从 Native Activity 的角度来看,它只是一个结构体。但是这个结构在通过 JNI 调用的 ANativeActivity_onCreate()
函数中传递给 Android(通常它是在 SDK 的 android_native_app_glue.c
中实现的,如果需要,您可以更改或替换)。因此,Android 将在管理应用时处理数据。
我通过删除上面的代码片段运行了一个简单的测试,幸运的是没有任何改变,即使没有保存它们,我的结构体的值在重新获得焦点后保持不变。
您的测试太软:) 尝试打开 Recents screen 并从那里关闭您的活动:点按 × 按钮或关闭所有命令。效果将是杀死应用程序,您现在应该会发现您的数据已被擦除,除非您使用保存-恢复机制。