活动被杀死时OnActivityResult()的行为不一致

时间:2011-10-31 21:00:25

标签: android

我遇到了Android生命周期的问题。据我所知,文档中没有介绍。

我有活动A,它使用startActivityForResult启动活动B.

public class ActivityA extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    Button b = (Button)findViewById(R.id.btnStart);
    b.setOnClickListener(new OnClickListener(){

        public void onClick(View v) {

                startActivityForResult(new Intent(ActivityA.this, ActivityB.class), 0);

        }});
}    
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.e("ActivityA", "onResult");     
}
}

活动B调用图库活动:

public class ActivityB extends Activity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.e("ActivityB", "onResult");     
    setResult(0, data);
    finish();   
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);      
    Button b = (Button)findViewById(R.id.btnStart);
    TextView v = (TextView)findViewById(R.id.helloText);
    v.setText("Activity B");
    b.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 0);

        }});     
}       
}

当活动A和B保留在内存中时,结果将按预期方式向下移回活动堆栈。

问题是图库活动可能会消耗足够的资源来推动活动A和活动B的内存不足。 Android杀死了这个过程。当gallery活动返回结果时,将再次创建活动A和B,并调用activityB的onActivityResult。但是,这次当ActivityB调用finish()时,新创建的ActivityA的onActivityResult被而不是调用。

我做错了吗? 这是一个错误吗? 这是预期的Android行为吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这不是错误。活动2第二次启动它不是由活动A启动的。当活动B被杀死时,您需要在onStoponPauseonDestroy方法中保存适当的状态,然后在活动重新启动时使用该状态。使用该信息,您可以在活动B退出时将相应的信息传递回活动A.

答案 1 :(得分:0)

所以这似乎是cyanogenmod的一个bug。我可以轻松地在我的Droid上使用CyanogenMod-7.0.3-Droid重现这个问题,但是在运行了一些带有库存操作系统和模拟器的设备后,似乎这只是在我的Cyanogen Droid上。非常令人沮丧的实现。