2016-08-03 2 views
2

У меня есть два вида деятельности - активность A и активность B. Пользователю предоставляется действие A при открытии приложения.Отправка данных между двумя действиями с использованием явных намерений

При нажатии кнопки на активность А, она открывает активность B.

В активность B, пользователю предлагается добавить текст в поле EditText, который хранится в объекте TextView.

Когда вы нажимаете кнопку в действии B, она перенаправляет вас на Activity A и передает данные, хранящиеся в объекте TextView, в Activity A для отображения на экране.

Моя логика предполагается:

Activity A создает новый Intent и переходит в активность В.

активность A вызывает startActivityForResult (намерения).

активность B затем вызывает getIntent(), но ничего не делает с ним, потому что нет ничего требуется (?)

В OnClick() метод, активность B создает новый Intent, переходящая в деятельности А. Деятельность B ставит свои результаты в новый намерение (т. е. использует aim.putExtra())

onActivityResult() в действии A вызывается.

Мне интересно, если это правильная логика?

ответ

3

Да, вы делаете то, что вам нужно. Может показаться немного странным передавать данные с помощью намерений, но именно так был разработан Android. Имейте в виду, что действия могут работать в разных процессах, поэтому система выполняет сериализацию и десериализацию данных для выполнения межпроцессного взаимодействия. Механизм намерения - это стандартный способ обмена информацией через них, и поэтому намерения содержат только примитивные данные, Parcelables и Serializables. При этом часть данных, обмениваемых намерениями, никогда не является одним и тем же экземпляром с обеих сторон, а фактическая копия исходных данных.

+0

Спасибо Флавио - Я думаю, я просто не понимал, почему активность B должна получить намерение, но затем ничего не делать с ним и создать новый? – javapalava

+0

И я думаю, я не уверен, где используется код запроса .... – javapalava

+0

Намерение не содержит только общую информацию. В нем содержатся вещи, которые позволяют системе знать, какова целевая активность. Это нормально, чтобы получить пустое намерение. Возможно, вам не нужно будет читать какую-либо информацию, но система должна была решить проблему, которую вы вызываете. –

0

Ваша логика прекрасно выглядит, как упомянуто Флавио. Просто хотел добавить, что вам не нужно вызывать getIntent() в Activity B, если вы не ожидаете чего-либо от намерения. Вы можете избежать этой линии.

0

Нет, это не так, как вы должны это делать.

При использовании 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().

Смежные вопросы