Нет, это не так, как вы должны это делать.
При использовании startActivityForResult()
деятельность, которая называется (B в вашем примере), должна использовать: setResult()
до finish()
. Это то, как он дает результат вызывающей активности.
Из операции B нет необходимости звонить getIntent()
, если вам не нужен какой-либо параметр, или чтобы проверить, были ли вы вызваны для получения результата.
Приведем пример: FriendsActivity
- это деятельность, предназначенная для управления друзьями, она обычно показывает текущий список друзей и позволяет добавлять больше.
С некоторого местом вашего приложения вам нужен пользователь выбрать друг для каких-либо действий, так что у вас есть кнопка: выбрать друг, который откроет FriendsActivity
с ACTION_PICK
и startActivityForResult()
.
Все это выглядит следующим образом:
Intent pickFriendIntent = new Intent(this, FriendsActivity.class);
pickFriendIntent.setAction(Intent.ACTION_PICK);
startActivityForResult(pickFriendIntent, REQUEST_PICK_FRIEND);
REQUEST_PICK_FRIEND
константа int
определяется в деятельности вызывающего абонента (полезно, если у вас есть более одного типа запроса с результатом).
От FriendsActivity
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// boolean flag to know if we are requested to pick or not
mPickMode = getIntent() != null && Intent.ACTION_PICK.equals(getIntent().getAction());
// etc...
}
Флаг давайте изменить поведение нашей деятельности, чтобы забрать друга.
Например, при нажатии на друга, вместо того, чтобы идти в свой профиль (или любые действия, которые использовали раньше) мы должны возвращать информацию другу и закончить деятельность:
public void onFriendClicked(Friend theFriend) {
if (mPickMode) {
Intent resultData = new Intent();
// assuming Friend is Parcelable, if not just pass an ID or something
// it's usually best to handle this with a custom Uri actually
resultData.putExtra("friendParcelable", theFriend);
// here we set the result for the calling activity
setResult(RESULT_FRIEND_PICKED, resultData);
// and then we finish this one
finish();
} else { ... }
}
RESULT_FRIEND_PICKED
является int
постоянный, обычно открытый. В нем указывается, какой результат произошел с родительской деятельностью, у вас может быть больше одного, к вашим потребностям. На самом деле хорошая идея также сделать публичные константы для дополнительных функций, например, "friendParcelable"
в приведенном выше примере.
Когда FriendsActivity
закончить вызывающий получить обратный вызов:
protected void onActivityResult (int requestCode,
int resultCode,
Intent data) {
if (requestCode == REQUEST_PICK_FRIEND) {
if (resultCode == FriendsActivity.RESULT_FRIEND_PICKED) {
Friend pickedFriend = data.getParcelableExtra("friendParcelable");
// do whatever you want with that information
} else if (resultCode == Activity.RESULT_CANCELED) {
// the FriendsActivity terminated without calling setResult();
}
}
}
Также обратите внимание, что это не обязательно называть finish()
сразу после setResult()
. Если вы вызовете setResult()
, а затем позвольте пользователю щелкнуть его, он все равно вернет результат. Однако, если после вызова setResult()
действие будет уничтожено и заново создано (например, при вращении устройства), вам придется снова позвонить setResult()
.
Спасибо Флавио - Я думаю, я просто не понимал, почему активность B должна получить намерение, но затем ничего не делать с ним и создать новый? – javapalava
И я думаю, я не уверен, где используется код запроса .... – javapalava
Намерение не содержит только общую информацию. В нем содержатся вещи, которые позволяют системе знать, какова целевая активность. Это нормально, чтобы получить пустое намерение. Возможно, вам не нужно будет читать какую-либо информацию, но система должна была решить проблему, которую вы вызываете. –