启动另外一个activity并不一定是单向的。我们也可以启动另外一个activity然后接受一个返回的result。为接受result,我们需要使用startActivityForResult()
,而不是startActivity()。 例如,下面是一个启动activity来选择联系人的例子:
**
启动activity
static final int PICK_CONTACT_REQUEST = 1; // The request code
...
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
接收Result
**
当用户完成了启动之后activity操作之后,系统会调用我们activity中的onActivityResult() 回调方法。该方法有三个参数:
- 通过startActivityForResult()传递的request code(非0)。
- 第二个activity指定的result code。如果操作成功则是RESULT_OK
,如果用户没有操作成功,而是直接点击回退或者其他什么原因,那么则是RESULT_CANCELED - 包含了所返回result数据的intent。
例如,下面显示了如何处理pick a contact的result:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
但是在fragment中如果想要在onActivityResult()中获得返回值再启动的时候就有所不同了,
需要用fragment去调用startactivity。一下提供支持activity和fragment兼容的启动activity和获取返回值的方法:
/**
* 跳转使用demo
*/
public void goUserActivity() {
// activity 调用
Intent intent1 = new Intent(this, UserInfoActivity.class);
// 传递数据
Bundle bundle = new Bundle();
intent1.putExtras(bundle);
startActivity(null, this, intent1, 2);
// fragment 调用
Intent intent2 = new Intent(this, UserInfoActivity.class);
// 传递数据
Bundle bundle1 = new Bundle();
intent2.putExtras(bundle1);
startActivity(this, null, intent2, 2);
}
/**
* 通用activity跳转
*
* @param f 跳转的fragment
* @param context 跳转的activity
* @param intent 跳转使用的intent
* @param requestCode 请求码>0
*/
public static void startActivity(Fragment f, Context context, Intent intent, int requestCode) {
if (f != null) {
f.startActivityForResult(intent, requestCode);
}
else if (context instanceof Activity) {
((Activity) context).startActivityForResult(intent, requestCode);
}
else {
context.startActivity(intent);
}
}
在跳转到UserInfoActivity后点击确定封装数据:
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putBoolean("boolean",true);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
在返回的activity或fragment中如下接受数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 在RESULT_OK之后保证是data使我们操作之后的结果
if (resultCode == RESULT_OK) {
if (requestCode == REQ_HOUSE) {
// 获取传递的数据
Bundle bundle = data.getExtras();
// 获得返回值
boolean istrue = bundle.getBoolean("boolean");
}
}
super.onActivityResult(requestCode, resultCode, data);
}
tip:
1.同时要获取联系人需要在menifest中声明READ_CONTACTS权限;
参考自:http://hukai.me/android-training-course-in-chinese/basics/intents/result.html