存储和恢复活动状态

时间:2016-06-09 13:52:32

标签: android android-activity activity-state

当调用另一个活动时,我可以确定当它返回时我存储在当前活动中的变量是否存在?

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
    }
});

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

4 个答案:

答案 0 :(得分:1)

是当您返回 Activity1 时会显示,因此无需使用getIntExtra。只需将您的位置存储在 Activity1 的全局变量中。

答案 1 :(得分:1)

理想情况下,您只需在# crontab file example SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=your@email.com 0 * * * * /usr/bin/python3 /data/script.py 2>&1 | tee /var/log/log.txt 中保存状态即可。这样你就不必通过Activity1传递变量,然后将结果(这不完全是Activity2中完成的任何结果)传递回Activity2。要在Activity1中保存position的值,您应该在Activity1内执行以下操作:

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); } 中使用position的值,否则我建议不要将Activity2公开给任何数据不需要管理。如果你正在开发一个大型应用程序,这些东西可能会加起来并迅速变得混乱。

答案 2 :(得分:0)

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

所以你可以这样做:

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

然后在你的Activity2类

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

答案 3 :(得分:0)

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

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