startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)
Android activity的setResult()在什么时候调用
如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!
如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的。
按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了。需要重写onBackPressed()函数。
以上摘抄自 http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html;
简单的例子
三个Activity,主Activity,如图所示,点击Button分别启动另外两个Activity。
返回 后者 点击 Button后,回到主Acticiy并传递数据到主Activity,并在TextView上显示处理
MainActivity
package com.example.work; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button btn2, btn3; private TextView tView; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); btn2 = (Button) findViewById(R.id.btn); btn2.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this, TwoActivity.class); intent.putExtra("totwo", "第一个Activity传递过来的22"); startActivityForResult(intent, 2);// startActivityForResult这个函数也可以正常传递数据给下一个Activity // 这里的 2 是自己设置的,但要>=0 } }); btn3 = (Button) findViewById(R.id.btn3); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { startActivityForResult(new Intent(MainActivity.this, ThreeActivity.class).putExtra("tothree", "第一个Activity传递过来的33"), 3);// 用上面的一个意思。 } }); } @Override // 用startActivityForResult()方法启动另外的Activity,退出或者返回之后,要调用这个onActivityResult函数来处理返回的intent。需要重写这个函数 protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub String result; tView = (TextView) findViewById(R.id.onetv); switch (requestCode) { case 2 : // 这里的2 与上面的startActivityForResult(intent, 2);里的2 是对应的。 if (resultCode == RESULT_OK) { // Log.i("MainAcitvity", RESULT_OK+""); // result = data.getExtras().getString("twodata"); // tView.setText(result); tView.setText(data.getExtras().getString("twodata")); } break; case 3 : // 同上面的是一个i额意思。 if (resultCode == RESULT_CANCELED) { Log.i("MainAcitvity", RESULT_CANCELED + ""); result = data.getExtras().getString("threeidata"); tView.setText(result); } break; default : break; } } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
TwoActivity
package com.example.work; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; public class TwoActivity extends Activity { private TextView tView; private Button btn; public static final String TAG = "TwoActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.twoactivity); tView = (TextView) findViewById(R.id.tv); tView.setText(getIntent().getStringExtra("totwo")); btn = (Button) findViewById(R.id.twobtn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { /* * intent 携带数据。setResult(resultCode, * data)带两个参数,resultCode一个是向上一个活动返回 --处理的结果--。一般是常量RESULT_OK * (值为0)或者RESULT_CANCELED(值为-1).另一个data是带有数据的intent。 * 当执行到finish()是,关闭当前的Activity,并返回带有数据的intent到调用它的Activity。 */ Intent intent = new Intent(); intent.putExtra("twodata", "Two传递过来的"); setResult(RESULT_OK, intent); // setResult必须在finish()这个函数前面。// finish(); } }); } @Override // 当用户不是点击button,而是点击 返回键是,调用这个函数。 public void onBackPressed() { // TODO Auto-generated method stub Intent intent = new Intent(); intent.putExtra("twodata", "Two传递过来的"); setResult(RESULT_OK, intent); finish(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i(TAG, "onDestroy"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.i(TAG, "onPause"); Intent intent = new Intent(); intent.putExtra("twodata", "Two传递过来的"); setResult(2, intent); // finish(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.i(TAG, "onRestart"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.i(TAG, "onResume"); // Intent intent =new Intent(); // intent.putExtra("aaa", "Two传递过来的"); // setResult(RESULT_OK, intent); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "onStart"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i(TAG, "onStop"); } }
ThreeActivity --(和第二个差不多)
package com.example.work; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; public class ThreeActivity extends Activity { private Button btn; private TextView tView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.threeactvity); btn = (Button) findViewById(R.id.threebtn); tView = (TextView) findViewById(R.id.threetv); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub setResult(RESULT_CANCELED, new Intent().putExtra("threeidata", "第三个Activit传递过来的数据")); finish(); } }); tView.setText(getIntent().getStringExtra("tothree")); } public void onBackPressed() { // TODO Auto-generated method stub setResult(RESULT_CANCELED, new Intent().putExtra("threeidata", "第三个Activit传递过来的数据")); finish(); } }