startActivityForResult如何工作?

时间:2013-09-21 12:48:45

标签: android

所以我有两节课。我要做的是将数据从 MainActivity 发送到 Main2 ,登录 Logcat ,然后将控制权恢复为 MainActivity 以便使用其他一些数据重复该步骤。

但是我得到了意想不到的结果。我没有得到 0,1,2,3,4 ,而是得到任何随机序列..有时候是相反的顺序。这是为什么??这是由于使用 for loop ??

MainActivity.java

public class MainActivity extends Activity {

int REQUEST_CODE = 0;
Intent i;
int k = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    i = new Intent(this, main2.class);
    loop();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        loop();
    }
}

public void loop() {
    for (int j = k; j < 5; j++, k++) {
        i.putExtra("value", j);
        startActivityForResult(i, REQUEST_CODE);
    }
}
}

Main2.java

public class main2 extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = getIntent();
    int i = intent.getIntExtra("value", 0);
    Log.d("Value", i + "");
    setResult(RESULT_OK);
    finish();
}  

}

3 个答案:

答案 0 :(得分:1)

这是因为,当您致电startActivityForResult时,您启动活动,最终将启动。请注意,不是立即启动,它们可能需要几毫秒才能启动。此外,Log.d也不是即时的。多线程编程与单线程编程有很大不同。

答案 1 :(得分:0)

您正在从同一个线程开始所有活动。因为它们不会在loop()方法完成之前启动。所有5项活动将首次一起开始。并且没有受助者他们将花费相同的时间来开始和结束。所以输出正常。

此外,即使你在另一个线程中开始每个活动,也没有受助者,第一个开始的活动将首先完成。

所有这些都取决于CPU处理。

你能做的就是摆脱循环。并在onActivityResult方法的最后一个活动的响应之后做一些逻辑来启动活动。

示例:

public void loop() {
    j = k;
    i.putExtra("value", j);
    startActivityForResult(i, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == RESULT_OK)
    {
        j++;
        if (j<5)
        {
            i.putExtra("value", j);
            startActivityForResult(i, REQUEST_CODE);
        }
        else
        {
            k++;
            loop();
        }
    }
}

我不确定。但我认为这正是你想要的。这可能需要一点时间不确定。

答案 2 :(得分:0)

startActivityForResult 的使用是针对特定需求的,例如, MainActivity 需要获取仅在 Main2 上可用的值检索此值。使用示例,您有一个活动A是一个写电子邮件的屏幕,它有一个输入联系信息的字段。活动B仅显示联系人列表。

在这种情况下,您基本上将执行以下操作:

  1. on Activity A:您将调用startActivityForResult(,)
  2. 活动B上的
  3. :您显示联系人列表并等待用户点击,在联系人的onClick上,您基本上会收到联系人的电子邮件。使用用户电子邮件,您将其设置为新的Intent并调用setResult(RESULT_OK,intentData);
  4. on onActivityResult()你会把代码期望调用结果== RESULT_OK并请求代码== X ...当它到来时,你会从onActivityResult方法的给定意图中读出参数,它将通过电子邮件和您传递给上一步意图的所有参数。
  5. 就是这样!祝你好运!