Данные Android теряются onCreate() после startActivity() для обратного вызова

У меня есть приложение для Android, которое подключается к твиттеру через twitter4j. В действии есть кнопка «Поделиться» и TextView. Поток показан ниже;

  1. Пользователь открывает действие, начиная с onCreate(), которое заполняет TextView
  2. Пользователь нажимает «Поделиться»
  3. Активность Twitter запускается для oAuth, пользователь вводит учетные данные и дает разрешение моему приложению
  4. Пользователь снова перенаправляется на действие, начиная с onCreate()

Моя проблема в том, что значение TextView теряется после второго onCreate().

- onCreate()
.
.
point = getIntent().getExtras().getInt("point");
.
.

- shareButton.onClick()
.
.              
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(requestToken.getAuthenticationURL()));// open twitter for authentication

intent .putExtra("point", point);
startActivityForResult(intent , 1);
}
});
thread.start();
.
.

Вещи, которые я пробовал до сих пор;

  • используя startActivityForResult() вместо startActivity()
  • используя намерение.putExtra() перед startActivity() и вызывая getIntent().getExtras().getInt("point") в onCreate(), но таких данных нет
  • используя onSaveInstanceState() и onRestoreInstanceState(), но saveInstanceState имеет значение null

Скажите, пожалуйста, как я могу сохранить эти данные после обратного вызова в твиттере. Я могу использовать базу данных или общие настройки или что-то в этом роде, но есть ли другой способ?

Заранее спасибо.

ИЗМЕНИТЬ:

Когда программа переходит в твиттер и возвращается обратно, она снова начинается с onCreate(), как и при изменении ориентации. Когда ориентация меняется, «Bundle saveInstanceState» имеет значение, но в моем случае не имеет значения.

Как я могу получить saveInstanceState, который я установил ранее вручную, во втором запуске onCreate() после возврата обратного вызова Twitter?

РЕДАКТИРОВАТЬ 2:

Некоторые люди на этом сайте действительно странные. Я разместил ответ ниже как новый пост, но кто-то удалил его, заявив, что «новый пост должен включать ответ». Знаете что, в этом посте есть настоящий ответ. Не действуйте так, не прочитав всего этого. Я пишу это ниже как редактирование.

Большое спасибо за ваш ответ (@rod_torres). Я попробовал ваше решение (с i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) и без него) и в обоих случаях не смог добиться результата. Жизненный цикл, когда я установил singleTop, был таким, как показано ниже;

onCreate() -> Twitter -> onCreate()

onNewIntent() не вызывался после возвращения из Twitter. Активность была воссоздана как новый экземпляр, поэтому я могу вернуться с помощью кнопки «Назад» в порядке, указанном выше.

Я попробовал с singleTask, и это сработало (ответ на мой вопрос таков, для тех, кто удалил мой пост, не прочитав эту часть). он не создал новый экземпляр активности, и был вызван метод onNewIntent(). Когда я нажимаю кнопку «Назад», я перенаправляюсь на предыдущую активность моего приложения, а не на задачу браузера (Twitter), хотя Twitter был предыдущей активностью. Поток был похож;

onCreate() -> Twitter -> onCreate (с пакетами) -> onNewIntent()

Активность A -> Активность B -> Twitter -> Активность B (то же, что и предыдущая)

когда я возвращаюсь из Activity B;

Действие A -> Браузер

Кажется, что режим singleTask вывел задачу моего приложения на передний план со всеми действиями в нем и перенес задачу другого приложения (браузера) в задний стек. Я прав?

Но все же я не мог понять, почему ваше решение не сработало для меня. Я прочитал много документации по этому поводу и думаю, что это должно было сработать.

Кроме того, я не уверен, следует ли мне использовать singleTask. Может быть что-то не так, чего я еще не учел, какие-то минусы?


person user1711289    schedule 26.04.2015    source источник


Ответы (1)


Как вы указываете в редактировании, действие воссоздается. Чтобы приложение не воссоздавало действие, добавьте в манифесте параметр launchMode со значением «singleTop» для действия, из которого вы будете использовать twitter4j.

<activity
        android:name=".SecondActivity"
        android:label="@string/title_activity_second"
        android:launchMode="singleTop">

Кроме того, когда вы вызываете это действие, добавьте флаг FLAG_ACTIVITY_CLEAR_TOP:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("string","Second Activity Biches");
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i); 

Чтобы получить больше информации:

http://www.inridea.com/blog/2011/6/16/android-understanding-activity-launchmode https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

person rod_torres    schedule 28.04.2015