存储和恢复 activity 个状态

Storing and restoring activity states

当调用另一个 activity 时,我可以确定我存储在当前 activity 中的变量在 returns 时会出现吗?

new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id)  {
        Intent i = new Intent(Activity1.this, Activity2.class);
        i.putExtra("position", pos); // 1
        position = pos; // 2
        startActivityForResult(i, REQUEST_CODE); // brings up the edit item activity
    }
});

对于上面的代码,我可以通过存储在当前 activity 实例字段中来使用 (2) 还是应该使用 (1) 传递值然后在 onActivityResult() 中使用 getIntExtra()恢复该值?

使用 startActivityForResult 时...您提供的请求代码将在 onActivityResult 方法中返回。在那里您将获得请求代码,以及结果代码(成功、失败等,以及您可以从 activity 开始设置的 Intent 数据。

所以你可以这样做:

Intent i = new Intent(Activity1.this, Activity2.class);
i.putExtra("position", pos);
startActivityForResult(i, REQUEST_CODE);

然后在你的 Activity2 class

Intent intent = new Intent();
intent.putExtras(getIntent().getExtra("position"));
setResult(RESULT_OK, intent);
finish();

您的第一个 Activity 将调用:

 onActivityResult(int requestCode, int resultCode, Intent data) {
//Check it's your requestCode,
//Check resultCode == RESULT_OK or whatever you need
//Grab your position from the data intent
}

有关详细信息,请参阅 https://developer.android.com/training/basics/intents/result.html

是 当你return到Activity1时它会出现所以不需要使用getIntExtra。只需将您的位置存储在 Activity1.

的全局变量中

我的建议:在 Intent 中传递足够的信息以唯一标识感兴趣的数据项。不要只传递一个位置,因为如果项目的顺序发生变化或其他项目从列表中获得 added/removed,则位置可能会发生变化。想象这样一种情况,您将位置 2 传递给 Activity2,但是当 Activity2 启动时,Activity1 重新加载其数据并且位置 2 现在是其他项目。

此外,我不会依赖调用 Activity 的实例成员(即代码中的 position = pos 行)。有可能您的 Activity1 被杀死,而另一个 activity 是最直接的前景 activity。在那种情况下,当结果返回给 Activity1 时,它会被重新创建,但它将是 Activity1 的一个新实例,所以你的实例成员 position 不会有你的数据之前设置。

理想情况下,您只需将状态保存在 Activity1 中。这样,您就不必通过 Activity2 传递变量,然后将结果(不完全是 Activity2 中所做的任何事情的结果)传递回 Activity1。要在 Activity1 中保存 position 的值,您应该在 Activity 中执行以下操作:

    private static final String KEY_ARG_POSITION = "KEY_ARG_POSITION";

    private int position;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Do whatever you are doing in onCreate already...

        if (savedInstanceState != null) {
            position = savedInstanceState.getInt(KEY_ARG_POSITION);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt(KEY_ARG_POSITION, position);
    }

如果您不想在屏幕方向改变或 OS 终止并重新启动 Activity 时丢失该值,这也是相关的。

最后,为了让您的代码保持井井有条,除非您需要在 Activity2 中使用 position 的值,否则我建议不要将 Activity2 暴露给任何数据它不需要管理。如果您正在开发一个大型应用程序,这些事情可能会加起来并很快变得混乱。