2016-08-03 58 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()

相关问题