2

У меня есть приложение для Android, которое подключается к твиттеру через twitter4j. В действии есть кнопка совместного доступа и TextView. Поток подобен ниже;Данные Android теряются onCreate() после startActivity() для обратного вызова

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

Моя проблема заключается в том, что величина е e 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()
  • с помощью intent.putExtra() перед startActivity() и призывающих getIntent(). GetExtras(). GetInt ("точка") в OnCreate(), но нет таких данных
  • с использованием onSaveInstanceState() и onRestoreInstanceState(), но savedInstanceState является нулевым

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

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

EDIT:

Когда программа идет в твиттер и вернуться, он снова начинается с OnCreate() так же, как при изменении ориентации. Когда меняется ориентация «Bundle savedInstanceState» имеет значение, но в моем случае не имеет значения.

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

EDIT 2:

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

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

OnCreate() -> Twitter -> OnCreate()

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

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

OnCreate() -> Twitter -> OnCreate (с пучками) -> onNewIntent()

активность А -> активность В -> Twitter -> активность В (то же самое с предыдущей)

, когда я вернуться из Activity B;

активность А -> Браузер

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

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

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

ответ

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.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

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