2016-08-03 13 views
2

2つのアクティビティ - アクティビティAとアクティビティBがあります。ユーザーには、アプリを開く際にアクティビティAが表示されます。明示的なインテントを使用して2つのアクティビティ間でデータを送信

あなたが活動Aのボタンをクリックすると、アクティビティBで活動B.

を開き、ユーザーがTextViewのオブジェクトに格納されているのEditTextフィールドの中にいくつかのテキストを追加するよう求めています。

アクティビティBのボタンをクリックすると、アクティビティAにリダイレクトされ、TextViewオブジェクトに格納されているデータがアクティビティAに渡されて画面に表示されます。

マイロジックを想定:

アクティビティAは、新しいインテントを構築し、アクティビティBに通過

アクティビティAは、startActivityForResult(インテント)を呼び出します。

活動Bはその後getIntent()を呼び出しますが、必要なものはないので、それを何もしない(?)

のonClick()メソッドでは、活動BはアクティビティA.アクティビティBに渡して、新しいインテントを作成し、その結果を新しいインテントに入れます(つまり、intent.putExtra()を使用)

アクティビティAのonActivityResult()が呼び出されます。

これが正しいロジックなら、私は疑問に思いますか?

答えて

3

はい、まさにあなたが期待していることを正確に実行しています。インテントでデータを渡すのはちょっと奇妙に思えるかもしれませんが、それがAndroidの設計方法です。アクティビティは異なるプロセスに存在する可能性があるので、システムはプロセス間通信を実行するためにデータをシリアライズしてデシリアライズします。インテントの仕組みは、それらの間で情報を交換する標準的な方法です。そのため、インテントは基本データParcelablesとSerializablesしか保持しません。つまり、インテントによって交換されるデータは、両面で決して同じインスタンスではなく、元のデータの実際のコピーです。

+0

Thanks Flavio - 私は、アクティビティBがインテントを取得しなければならないと思っていましたが、それでは何もしないで新しいものを作成する必要がありますか? – javapalava

+0

そして、私は、要求コードがどこで使用されているかはわかりません。 – javapalava

+0

インテントは共有情報だけを保持しません。それは、システムが目標とする活動が何であるかを知ることを可能にするものを保持する。それは空の意図を得るのは大丈夫です。そこから情報を読む必要はないかもしれませんが、あなたが呼んでいる活動を解決するためにはシステムが必要でした。 –

0

あなたのロジックはFlavioのようにうまく見えます。インテントから何も期待していない場合は、アクティビティBでgetIntent()を呼び出す必要がないことを追加したいだけです。その行を避けることができます。

0

いいえ、それはあなたがそれをやるべきではありません。

startActivityForResult()を使用する場合、アクティビティ(例ではB)を使用する必要があります。setResult()より前にfinish()。これが呼び出しアクティビティに結果を与える方法です。

アクティビティBから、パラメータが必要な場合や、結果が必要かどうかを確認する必要がない限り、getIntent()に電話する必要はありません。

例を挙げてみましょう:FriendsActivityは、友だちを管理するためのアクティビティです。通常、現在のフレンドリストを表示し、さらに追加することができます。

のアプリのいくつかの場所からあなたには、いくつかのアクションのために友達をユーザが選択することが必要なので、あなたがボタンを持っている:ACTION_PICKstartActivityForResult()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_PICKEDintです常時、一般に公開されます。それは親活動にどのような結果が生じたかを示します。あなたのニーズに応じて、それ以上のものを持つことができます。上記の例では、"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()に再度電話する必要があります。

関連する問題