いいえ、それはあなたがそれをやるべきではありません。
startActivityForResult()
を使用する場合、アクティビティ(例ではB)を使用する必要があります。setResult()
より前にfinish()
。これが呼び出しアクティビティに結果を与える方法です。
アクティビティBから、パラメータが必要な場合や、結果が必要かどうかを確認する必要がない限り、getIntent()
に電話する必要はありません。
例を挙げてみましょう:FriendsActivity
は、友だちを管理するためのアクティビティです。通常、現在のフレンドリストを表示し、さらに追加することができます。
のアプリのいくつかの場所からあなたには、いくつかのアクションのために友達をユーザが選択することが必要なので、あなたがボタンを持っている:ACTION_PICK
とstartActivityForResult()
でFriendsActivity
を開き、友人を選択します。
ことのすべては、次のようになります。(あなたは結果とリクエストの一種で、より多くを持っている場合に便利)
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();
}
}
}
はまた、右setResult()
後finish()
を呼び出すことは必須ではないことに注意してください。 setResult()
に電話して、ユーザーがそれをクリックすると、結果が返されます。しかし、setResult()
への呼び出しの後にアクティビティが破棄されて再作成された場合(デバイスの回転など)は、setResult()
に再度電話する必要があります。
Thanks Flavio - 私は、アクティビティBがインテントを取得しなければならないと思っていましたが、それでは何もしないで新しいものを作成する必要がありますか? – javapalava
そして、私は、要求コードがどこで使用されているかはわかりません。 – javapalava
インテントは共有情報だけを保持しません。それは、システムが目標とする活動が何であるかを知ることを可能にするものを保持する。それは空の意図を得るのは大丈夫です。そこから情報を読む必要はないかもしれませんが、あなたが呼んでいる活動を解決するためにはシステムが必要でした。 –