2016-08-03 69 views
2

我有兩個活動 - 活動A和活動B.用戶在打開應用程序時顯示活動A.使用顯式意圖在兩個活動之間發送數據

當你點擊活動A的按鈕,它會打開活動B.

在活動B,系統會提示用戶添加一些文本到一個EditText字段,它存儲在一個TextView對象。

當您單擊活動B上的按鈕時,它將您重定向到活動A,並將存儲在TextView對象中的數據傳遞到活動A以顯示在屏幕上。

我假定邏輯:

活動A構造新意圖並通過在活動B.

活性A調用startActivityForResult(意圖)。

活動B然後調用getIntent(),但確實與它無關,因爲需要什麼(?)

在的onClick()方法,活動B創建一個新的意圖,傳遞活動A.活動B將其結果放入新的意圖(即使用intent.putExtra())

onActivityResult()在Activity A中被調用。

我想知道,如果這是正確的邏輯?

回答

3

是的,你正在做的事情如你所料。通過意圖傳遞數據似乎有點奇怪,但這就是Android設計的方式。請記住,活動可能存在於不同的進程中,因此係統會對數據進行序列化和反序列化以執行進程間通信。意圖機制是通過它們交換信息的標準方式,這就是爲什麼意圖只保存原始數據,Parcelables和Serializables。這就是說,一個意圖交換的數據在雙方都不是同一個實例,而是原始數據的實際副本。

+0

謝謝弗拉維奧 - 我想我只是不明白爲什麼活動B必須獲得意圖,但隨後什麼都不做,並創建一個新的? – javapalava

+0

我想,我不太確定使用請求代碼的位置...... – javapalava

+0

Intent不僅僅保存共享信息。它擁有讓系統知道什麼是目標活動的內容。得到一個空的意圖是很好的。您可能不需要從中讀取任何信息,但系統必須解決您所調用的活動。 –

0

弗拉維奧提到你的邏輯看起來很好。只是想補充一點,如果您不期望任何意圖,您不必在活動B中調用getIntent()。你可以避開那條線。

0

不,這不是你應該如何去做。

當使用startActivityForResult()時,被調用的活動(在您的示例中爲B)必須使用:setResult()之前finish()。這是它給一個結果給呼叫活動的方式。

從活動B沒有必要打電話給getIntent()除非你需要一些參數或檢查您是否已經呼籲的結果。

讓我們做出了榜樣:FriendsActivity是指管理好友的活動,它通常顯示當前好友列表,並允許添加更多。

從一些地方您的應用程序需要用戶選擇了一些行動朋友,讓你有一個按鈕:選擇朋友,它打開FriendsActivityACTION_PICKstartActivityForResult()

所有的,看起來像這樣:

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()

相關問題