startActivityForResult的初步学习
最后更新于:2022-04-01 14:43:21
安卓Activity之间传数据除了用putExtra之外还可以用startActivityForResult获取一个Activity的返回值。为了简单阐述这种方式我们来做个简单的模型:
假设A去开启B,则调用函数 void startActivityForResult([Intent]() intent,int requestCode),这时候会设置一个requestCode,要求>=0就行了
这时候A需要覆盖onActivityResult方法获取返回值,这个方法具体是这样的:void onActivityResult(int requestCode,int resultCode,[Intent]() data),requestCode的数值就是刚刚设置的requestCode,resultCode的数值会在B里面设置。这个函数将在B结束后调用。
这时候B需要调用setResult函数设置返回值,这个函数具体是这样的:void setResult(int resultCode,[Intent]() data),第一个参数设置resultCode,这里的resultCode就是onActivityResult的resultCode。
查了一些资料关于这几个函数的调用时机,发现下面这句话总结的很好:
**B**退回**A**过程中,首先是**B**处于Pause 状态,然后等待 **A **执行****restart——〉 start ——〉resume,然后才是B 的stop——〉destroy,而**A**的 onActivityResult() 需要在**B**pause之后,**A**restart 之前 这中间调用,所以**B**中的setResult()函数应该放在**B**pause 之前调用。这点非常的重要啊。
下面是代码:
第一个Activity:
~~~
package com.example.mytest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
}
public void click(View v) {
Intent intent = new Intent(this, NextActivity.class);
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
String str = data.getStringExtra("data");
tv.setText(str);
System.out.println("onActivityResult");
}
}
~~~
第二个Activity:
~~~
package com.example.mytest;
import java.util.Random;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class NextActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.next_activity);
Intent intent = new Intent(this ,MainActivity.class);
intent.putExtra("data", "传输");
this.setResult(2, intent);
}
}
~~~