2014-02-09 50 views
0

我有3类Ç的Android的onCreate()和的onResume()的查询

我把一些对象从A改为B。在B,在onCreate(),我从意图中拉出这些,并保留它们作为类变量。现在活动B允许用户编辑这些对象。这通过startActivityForResult()通过将对象从B传递到C而发生。

现在,当用户正与编辑完成后,Ç与修改的对象,并且结束沿通过的结果INT回。现在当我回到B,在onActivityResult(),我拉出这些对象,并更新相应的类变量。但onCreate()再次调用,类恢复到那个一个送给而不是保持该Ç送给的那些对象。

现在,如果使得onCreate()B每次都访问数据库,并且显然它工作正常。但它看起来很浪费。

那么,我该如何处理这种情况呢?如果onCreate()无论如何将被称为,似乎onResume(),startActivityForResult()onActivityResult()是没用的,我不妨将所有的代码在onCreate()

请指教!

下面是将用户从Ç

public void goToC(View v) { 

     Intent intent = new Intent(this, C.class); 
     intent.putExtra("STUFF", stuff); 
     startActivityForResult(intent, 1); 

} 

下面是代码中Ç其将数据传递回

long rowsUpdated = myModel.updateStuff(this, stuff); 

if (rowsUpdated == 1) { 
    Intent intent = new Intent(this, B.class); 
    // put the data in the intent 
    intent.putExtra("STUFF", stuff); 
    // set the flags to reuse B 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    // set result code to notify the ItemEntriesActivity 
    setResult(1, intent); 
    // finish the current activity i.e. C 
    finish(); 
} 

代码这里是B中的代码,它接收上面的da TA

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     if (intent != null) { 
      switch (resultCode) { 
      case 1: 
       // Update the class variable, so that onResume() gets the updated value 
       stuff = intent.getExtras().getParcelable("STUFF"); 
       break; 
      default: 
       break; 
      } 

     } 
    } 

正如我所说的,这个代码工作正常,但由于B.onCreate()被在此之后执行,活动B再次使用的旧值结束。

更新:我试图从Ç回去时使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP)。这仍然不起作用。我在电话finish()。任何建议表示赞赏!

更新2:当我在把一个调试点在onStop(),它是越来越只要我切换到Ç调用。难怪B中的onCreate()将被调用。现在我的问题是为什么onStop()被调用。我在C做的唯一'非自然'的事情是使用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);来显示没有键盘的TextEdits。所以我试着将android:configChanges="keyboard|keyboardHidden"加入到Manifest的活动中,没有任何区别。再次,任何建议表示赞赏。

+0

当必须(重新)创建活动并且无法阻止该活动发生时调用'onCreate'。最初的意图是有用的,所以你有两种不同的意图,你必须以不覆盖它的方式进行管理。 – zapl

+0

将修改后的变量写入意图(或以其他方式保存)。然后检查修改后的值,并在OnCreate中代替默认值加载它们。 – NameSpace

+0

当我在** B **中执行'getIntent()'时,我总是得到我从A发送的那个。这是因为我在** C **中调用了'finish()'而不是'startActivity()' 。那么我应该继续并删除'onResume()','onActivityResult()'等,等等? – rgamber

回答

0

您所创建的Intent去与

Intent intent = new Intent(this, B.class); 

此构造函数将创建B另一个实例这的确会调用onCreate()。您应该使用空的构造函数

Intent intent = new Intent(); 
// set result code to notify the ItemEntriesActivity 
setResult(1, intent); 
// finish the current activity i.e. C 
finish(); 
+0

感谢您的时间,但这一修改并未改变结果。这是有道理的。我想知道更多关于Intents的内容。在调试时,onCreate()仍然被击中。还有什么想法? – rgamber

+0

嗯...不是在这个时候。这应该修复它。你没有在'B'中调用'finish()',对吧?我遇到过这样的问题,而Intent构造函数通常是罪魁祸首。 – codeMagic

+0

Nopes,我发布了将用户从B到C的代码。它几乎只是用一个新的Intent调用'startActivityForResult()'。谢谢你的时间,但!我很感激! – rgamber

相关问题