存储和恢复 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
暴露给任何数据它不需要管理。如果您正在开发一个大型应用程序,这些事情可能会加起来并很快变得混乱。
当调用另一个 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
暴露给任何数据它不需要管理。如果您正在开发一个大型应用程序,这些事情可能会加起来并很快变得混乱。