【问题标题】:can we use Intent extras to preserve UI ?我们可以使用 Intent extras 来保留 UI 吗?
【发布时间】:2019-02-17 23:08:54
【问题描述】:

我正在阅读有关用于跨配置更改和系统启动的进程死亡保留 UI 数据的不同方法。我遇到了这一段,我不明白。

谁能解释一下?

此外,当您从 Intent 打开一个 Activity 时,当配置更改和系统恢复该 Activity 时,额外的捆绑包都会传递给该 Activity。如果在启动 Activity 时将一条 UI 状态数据(例如搜索查询)作为 Intent extra 传入,则可以使用 extras 包而不是 onSaveInstanceState() 包。

链接:https://developer.android.com/topic/libraries/architecture/saving-states

【问题讨论】:

  • 他们根本没有提到 Intents 的附加功能 - 他们的意思是 Bundle savedInstanceState 传递给 Activity#onCreate 方法
  • 这个新的 stackoverflow 用户发布了一个礼貌、清晰的问题,突出了他们不太理解的官方 android 开发人员文档的确切段落。我很失望其他用户将其否决为-3!这应该是一个支持所有人的论坛,无论当前的技能水平如何。我投了赞成票,希望@ahmed dahy 不会因为继续使用 stackoverflow 来学习和提高他们的编码技能而气馁。我希望其他人也能投票。
  • @SoundConception 非常感谢您的支持。就像你说的,人们应该意识到知识不是一蹴而就的。绝对不是将一些数据从一个存储设备传输到另一个存储设备的问题。

标签: android user-interface configuration


【解决方案1】:

他们的意思是,当 Activity 在“配置更改”或“系统启动的进程死亡”之后恢复时,您可以使用多个来源来检索数据,以便像以前一样设置它,例如:

  1. 在 Activity 被终止之前存储在 savedInstanceState 包中的任何内容。
  2. 首先用于启动活动的Intent 中存储的任何内容。同样的Intent 在活动被杀死后仍然可用并且 已恢复。

例如,假设您有一个 UserProfile 活动,显示有关当前用户的信息。当您从其他活动启动UserProfileActivity 时,您可以在Intent 中包含有关用户的信息:

// Create Intent to start the `UserProfileActivity`
final Intent intent = new Intent(this, UserProfileActivity.class);
intent.putExtra("first_name", "John");
intent.putExtra("last_name", "Doe");

// Launch the intent
startActivity(intent);

然后在UserProfileActivity 中您可以检索该信息:

// Get the intent that was used to launch this activity
final Intent = getIntent();

// Get the required info from the intent
final String firstName = intent.getStringExtra("first_name");
final String lastName = intent.getStringExtra("last_name");

// Update the UI
TextView tvName = findViewById(R.id.userName);
tvName.setText(firstName + " " + lastName);

现在说UserProfileActivity 有一个“关于你” EditText 字段和一个“保存” 按钮,它将把 EditText 的内容存储在他们的配置文件中。
当用户决定旋转屏幕时,他们正在“关于你” EditText 中写入内容。活动被杀死,但他们还没有点击“保存”按钮!他们写的所有东西都丢失了=不满意的用户!

我们如何才能创造更好的用户体验?当UserProfileActivity 即将被杀死时,onSaveInstanceState() 将被调用,因此将 "About You" EditText 的当前内容保存在 savedInstanceState 包中,并在活动时恢复它被重新创建。

@Override
protected void onSaveInstanceState(Bundle outState) {

    // Store relevant state variables
    final EditText etAboutYou = findViewById(R.id.aboutYou);
    outState.putString("about_you", etAboutYou.getText().toString());

    super.onSaveInstanceState(outState);
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_profile);

    // Restore saved state if required
    if (savedInstanceState != null) {
        final String aboutYou = savedInstanceState.getString("about_you");
        final EditText etAboutYou = findViewById(R.id.aboutYou);
        etAboutYou.setText(aboutYou);
    }
}

【讨论】:

  • 正是我需要的解释。非常感谢
  • 为了其他人也受益,我问这个的原因是我不明白为什么 Intent(用于创建新活动)是在保存活动状态后被恢复的上下文中引入的配置更改或系统启动的进程死亡。 @Sound Conception 先生优雅的回答解释了这一点。
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多