返回父活动时设置意图

时间:2014-06-21 13:58:56

标签: android android-intent android-navigation

我之前提出的应用程序需要一个特定活动的ID,用于进行数据库查询。当活动开始时,我从意图中获取此ID,因此:

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

    Bundle extras = getIntent().getExtras();
    if(extras !=null)
    {
      project_id = extras.getLong("project_id");
    }
    // ... the rest of the initialisation follows here
}

此活动(CountingActivity)依次通过用户的交互(EditProjectActivity)启动另一个活动,该交互将CountingActivity作为父级,以便通过主页按钮返回工作。在AndroidManifest.xml中我有这个:

    <activity
        android:name="myproject.EditProjectActivity"
        android:label="@string/title_activity_edit_project"
        android:theme="@style/Theme.AppCompat"
        android:parentActivityName="myproject.CountingActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="CountingActivity" />
    </activity>

当用户完成编辑后,他们可以执行以下三项操作之一:

  1. 按&#39;保存&#39;按钮。保存数据,调用finish()并返回CountingActivity。
  2. 按Android后退按钮。 EditProjectActivity从堆栈弹出而不保存,计数活动返回。
  3. 按左上角的应用程序图标。不知何故,CountingActivity在没有project_id intent的情况下启动;此值最终设置为0,并且在数据库中找不到任何内容,结果不合理。
  4. 不知何故,我需要确保在导航回父活动时将project_id作为意图传递。我没试好就试过这个:

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        int id = item.getItemId();
        if (id == R.id.home) // I also tried R.id.homeAsUp
        {
            Intent intent = new Intent(EditProjectActivity.this, CountingActivity.class);
            intent.putExtra("project_id",project_id);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }
    

    但是,仍然没有project_id,因此无法进行数据库查询。所以,如果有人能指出我正确的方向,我会很感激。

1 个答案:

答案 0 :(得分:3)

使用android.support.PARENT_ACTIVITY时,必须将父活动设置为singleTopFLAG_ACTIVITY_CLEAR_TOP。否则将创建一个新实例。请参阅示例Android: Activities destroyed unexpectedly, null savedInstanceState

但是,根据使用情况,可以使用更简单的替代方案。如果EditProjectActivity 始终CountingActivity(并且从不自己)调用总是想要返回那里,那么最简单的解决方案就是使用:

if (id == R.id.home)
{
    setResult(...); // optional, whether you want to treat this as save/cancel.
    finish();
}