发开过程中,免不了多个页面之间相互交互通信。
Android中使用startActivityForResult方法和onActivityResult配合完成任务
startActivityForResult方法:
public void startActivityForResult (Intent intent, int requestCode)
public void startActivityForResult (Intent intent, int requestCode, Bundle options)
intent对象:
启动目标Activity,传递数据
requestCode码:
如果此值大于等于0,将会在当前Activity的onActivityResult方法中作为判断回传的子Activity的依据
onActivityResult 方法:
protected void onActivityResult (int requestCode, int resultCode, Intent data)
requestCode请求码:作为判断回传的子Activity的依据
resultCode结果码:子Activity的操作结果表示
intent对象:子Activity数据载体
使用步骤:
1.父Activity中重写onActivityResult方法
2.使用startActivityForResult启动子Activity
Ex:
1.MainActivity
Button btn = (Button)findViewById(R.id.btnGotoSecondActivity); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // 设置传递的数据 Intent intent = new Intent(arg0.getContext(),SecondActivity.class); Bundle bundle = new Bundle(); bundle.putString("data", "hello third activty"); intent.putExtra("data", bundle); // 设置请求码 startActivityForResult(intent, SecondActivityRequestCode); } }); Button btnThird = (Button)findViewById(R.id.btnGotoThirdActivity); btnThird.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // 设置传递的数据 Intent intent = new Intent(arg0.getContext(),ThirdActivity.class); Bundle bundle = new Bundle(); bundle.putString("data", "hello third activty"); intent.putExtra("data", bundle); // 设置请求码 startActivityForResult(intent, ThirdActivityRequestCode); } });
2.onActivityResult
/* requestCode:请求码 * 用于标识回传的子Activity,根据此值判断是从哪一个子Activity返回的,它与startActivityForResult方法中的requestCode对应 * * resultCode:结果码 * 是子Activity的一个结果标识,一般在子Activity中定义,子Activity操作结束之后,使用setResult方法设置子Activity的结果状态 * 父Activity根据此结果码判断为对应的Activity做不同的处理 * * example: * if(requestCode == secondActivityRequestCode) * { * if(resultCode == SecondActivityResultCodeSuccess) * { * // do success * } * else if(resultCode == SecondActivityResultCodeFail) * { * // do fail * } * } * * data:Intent对象 * 子Activity的Intent对象,从此对象中获取Bundle载体,获取子Activity传递的数据 * * @see android.app.Activity#onActivityResult(int, int, android.content.Intent) */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); // 从SecondActivity返回 if(requestCode == SecondActivityRequestCode) { Intent intent = data; Bundle bundle = intent.getExtras(); // 如果SecondActivity操作成功 if(SecondActivity.SecondActivityResultCode1 == resultCode) { String dataString = bundle.getString("data"); Toast.makeText(this, "get data from SecondActivity" + SecondActivity.SecondActivityResultCode1,Toast.LENGTH_SHORT).show(); } else if(SecondActivity.SecondActivityResultCode2 == resultCode) // 如果SecondActivity操作失败 { String dataString = bundle.getString("data"); Toast.makeText(this, "get data from SecondActivity" + SecondActivity.SecondActivityResultCode2,Toast.LENGTH_SHORT).show(); } } else if(requestCode == ThirdActivityRequestCode) //从ThirdActivity返回 { Intent intent = data; Bundle bundle = intent.getExtras(); String dataString = bundle.getString("data"); Toast.makeText(this, "get data from ThirdActivity :" + dataString,Toast.LENGTH_SHORT).show(); } }
3.SecondActivity
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub // return super.onKeyDown(keyCode, event); // 如果是物理返回按键 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // 获取Intent Intent itent = this.getIntent(); // 创建Bundle对象,设置需要回传的数据 Bundle bundler = new Bundle(); bundler.putString("data", "i ' m come from SecondActivity"); // 为Intent设置数据载体Bundle itent.putExtras(bundler); // 设置结果 // this.setResult(SecondActivityResultCode1, itent); this.setResult(SecondActivityResultCode2, itent); // 结束当前Activity this.finish(); return false; } else // 如果不是物理返回按键则正常响应 { return super.onKeyDown(keyCode, event); } }