activity间数据传递--startActivityForResult()&setResult()
2016-10-01 10:08
501 查看
一个activity启动另一个activity最简单的方式是使用startActivity()方法,activity调用startActivity()方法时,实际上是把调用请求发送给操作系统的ActivityManager。ActivityManager负责创建Intent中指定activity的实例并调用其onCreate()方法,应用内部交互图
activity间传递数据则要调用startActivityForResult(…)方法,
FirstActivity:
SecondActivity接收数据并调用setResult(…)把处理结果回传给FirstActivity
调用setResult()的时机,查看源码
可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的
按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
也可通过重写onBackPressed()方法捕获用户点击后退键的动作,要注意的是setResult(…)要在super.onBackPressed()之前调用
FirstActivity要接收来自SecondActivity返回的数据,重写onActivityResult()方法
activity间传递数据则要调用startActivityForResult(…)方法,
FirstActivity:
Intent intent=new Intent(this,Second.class); intent.putExtra("index",true); startActivityForResult(intent,0); @Override public void startActivityForResult(Intent intent, int requestCode) { super.startActivityForResult(intent, requestCode); }
SecondActivity接收数据并调用setResult(…)把处理结果回传给FirstActivity
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{ private TextView answer_tv; private Button show_answer_tn; private Boolean answer_cheat; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cheat); answer_tv= (TextView) findViewById(R.id.answer_textview); show_answer_tn= (Button) findViewById(R.id.show_answer_btn); answer_cheat=getIntent().getBooleanExtra("index",false); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.show_answer_btn: answer_tv.setText(answer_cheat.toString().trim()); setAnswerShownResult(true); break; } } /*setResult()方法应在finish()方法前调用,点击后退键就是调用finish()方法, 最好就是在onCreate()方法中调用,否则会出现还没调用setResult()方法就返回前一个activity 点击后退键默认回传的resultCode为RESULT_CANCELED,表示什么都没做,操作取消 */ private void setAnswerShownResult(boolean isAnswerShown){ Intent data=new Intent(); data.putExtra("answer_shown",isAnswerShown); setResult(RESULT_OK,data); } }
调用setResult()的时机,查看源码
public final void setResult(int resultCode, Intent data) { synchronized (this) { mResultCode = resultCode; mResultData = data; } } public void finish() { finish(DONT_FINISH_TASK_WITH_ACTIVITY); } private void finish(int finishTask) { if (mParent == null) { int resultCode; Intent resultData; synchronized (this) { resultCode = mResultCode; resultData = mResultData; } if (false) Log.v(TAG, "Finishing self: token=" + mToken); try { if (resultData != null) { resultData.prepareToLeaveProcess(this); } if (ActivityManagerNative.getDefault() .finishActivity(mToken, resultCode, resultData, finishTask)) { mFinished = true; } } catch (RemoteException e) { // Empty } } else { mParent.finishFromChild(this); } }
可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的
按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
@Override public void onBackPressed() { setResult(...); super.onBackPressed(); }
也可通过重写onBackPressed()方法捕获用户点击后退键的动作,要注意的是setResult(…)要在super.onBackPressed()之前调用
FirstActivity要接收来自SecondActivity返回的数据,重写onActivityResult()方法
//此方法是接收来自其他activity中setResult()传回来的resultCode和intent @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==0&&resultCode==RESULT_OK){ if (data!=null){ isCheated=data.getBooleanExtra("answer_shown",false); } } }
相关文章推荐
- 基于startActivityForResult方法处理两个Activity之间数据传递问题
- startActivityForResult数据传递
- 使用EventBus代替startActivityForResult向上传递数据
- 两个activity之前传递数据startActivityForResult
- intent传递数据的二种方式startActivityForResult为什么不行?
- Intent的用法(一),启动activity传递数据以及startActivityForResult .
- 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现
- intent传递数据的二种方式startActivityForResult为什么不行?
- Intent的用法(一),启动activity传递数据以及startActivityForResult
- startActivityForResult和setResult详解 ---Cynthia&Sky
- 两个activity之间传递数据用startActivityForResult方法。
- 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现
- [置顶] 数据传递之startActivityForResult
- Activity之间startActivityForResult传递和接受数据
- intent传递数据的二种方式startActivityForResult为什么不行?
- startActivityforResult传递List<Object>参数错误问题
- [Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案
- Activity初级:startActivityForResult、重写onActivityResult、setResult回传数据、requestCode请求码
- 第五天:Bundle数据传递、StartActivityForResult传值
- Android Fragment的使用 七 Argument和startActivityForResult传递数据