Android:从更深的层次结构返回时,意图传递的数据消失了

Android: Data passed with intent disappears when coming back from deeper hierarchy

我有一个包含列表视图的 OverviewActivity。选择一个项目时,将创建一个意图以移动到 DetailActivity 并且我将一个 int 传递给它。

这个int赋值给一个私有变量,用来查询数据库。

详细活动代码:

private int mIssueId;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_issue_detail);

    mIssueId = getIntent().getIntExtra(IssueOverviewFragment.INTENT_ISSUE_ID, -1);
    ...
}

在 DetailActivity 中,我可以转到 GraphActivity。但是当我按下 GraphActivity 中的 upButton 时,应用程序崩溃,因为变量在 DetailActivity 中变为 -1(因此无法正确查询数据库)。

层次结构是: OverviewActivity -> DetailActivity -> GraphActivity

GraphActivity代码:

protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_graph );

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        ...
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_detail, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_logout: {
            Utility.redirectToLogin(this);
            break;
        }
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

如何在 DetailActivity 中保留我的 mIssueId 属性的值?

您似乎正在获取默认值,因为在 DetailActivity 中获取意图时出现问题。您可以尝试使用

稍微分解您的请求
mIssueId = getIntent().getExtras().getInt();

但我认为问题可能出在您如何将 int 放入 intent 中。

它应该看起来像

Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra(IssueOverviewFragment.INTENT_ISSUE_ID, mIssueId);
startActivity(intent);

Intent 旨在在活动之间传递信息。当Activity1将控制权交给Activity2时,大多与activity.

的行为有关

如果您有信息需要在复杂的层次结构中共享或可用于整个应用程序,如果您需要持久性,则可以在共享首选项之间进行选择,或者如果数据只需要使用单例 class在应用 运行.

期间需要

这是一个单例示例 class 保持信息对整个应用程序可用:

public class AppData {
  private static AppData ourInstance = new AppData ();

  public int score;

  public static AppData getInstance () {
    return ourInstance;
  }
}

以及如何访问它:

AppData.getInstance().score = 100;

希望对您有所帮助。