原文by Norman Peitek 翻译by Dexter0218
startActivityForResult()的内部使用
每个Android开发者都知道startActivityForResult(Intent i)会调用外部的app去做一些特定的事情,然后得到返回的结果。比如,使用Camera应用去拍照。然而,startActivityForResult(Intent i)在内部使用得并不多。最好的例子是,如果你的应用有一个LoginActivity。那个LoginActivity经常不是正常使用的一部分,而是一个一次性的操作来满足一个特定操作的结果。
所以,在LoginActivity里不要使用startActivity()和finish()的结合,使用startActivityForResult(Intent i)会是更好、更清晰的选择。调用Activity调用登录Activity,并告诉它需要有个结果返回:
public final static int LOGIN_REQUEST_CODE = 1;
public void loginButtonClick(View view) {
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivityForResult(intent, LOGIN_REQUEST_CODE);
}
它会打开LoginActivity。LoginActivity会处理登录并且返回一个结果。例如返回一个用户对象说明成功登录,或错误信息表明登录失败。
bool loginSuccessful = true; // or false, depending on the login
String errorMessage = .. // set when there was an error
if (loginSuccessful) {
setResult(RESULT_OK); // you can call setResult() without additional data
}
else {
// you can call setResult() with additional data by passing an intent
Intent resultIntent = new Intent();
resultIntent.putExtra("error", errorMessage);
setResult(RESULT_CANCELED, resultIntent);
}
finish();
另一个方面,会返回数据到调用者MainActivity,MainActivity必须接收这个结果,并采取合适的操作:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == LOGIN_REQUEST_CODE) {
if (resultCode == RESULT_OK){
// todo login was successful, take appropriate action
}
else if (resultCode == RESULT_CANCELED) {
// login failed, get error message
String errorMessage = data.getStringExtra("error");
// todo take appropriate action matching the error message
}
}
}
应当给你一个好的例子,如何干净简单去实现一个Activity,并返回一个结果。如果想要知道更多,看看下面的链接:
Intent.ACTION_CALL和 Intent.ACTION_DIAL的区别
我们已经遇到多个Android开发者不知道Intent.ACTION_CALL
和 Intent.ACTION_DIAL
之间的微妙关系。
Intent.ACTION_CALL
,打开手机app,拨号并呼叫一个号码。用户在动作结束前没有检查呼叫号码的机会。这也就是Intent.ACTION_CALL
需要一个额外的权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
Intent.ACTION_DIAL
,在大多数使用案例中,非常重要也是用户友好地,应该只打开手机应用,输入手机号码,但并不会点击那个绿色的“呼叫”按钮。假如用户按错了,他需要自己决定是否真的要联系这个号码。并且不需要权限声明。
我们希望你学到了一些Intent的知识。你的Intent的技巧是啥?可以在下面的评论中分享一下。
网友评论