Android 数据在 startActivity() 回调后 onCreate() 丢失

标签 android twitter4j android-lifecycle activity-lifecycle data-persistence

我有一个通过 twitter4j 连接到 twitter 的安卓应用程序。在一个 Activity 中有一个共享按钮和一个 TextView。流程如下;

  1. 用户打开启动 onCreate() 的 Activity ,该 Activity 填充 TextView
  2. 用户点击“分享”
  3. 为 oAuth、用户类型帐户启动 Twitter Activity 凭据并授予我的应用程序权限
  4. 用户再次从 onCreate() 开始被重定向到 Activity

我的问题是 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()
  • 在 startActivity() 之前使用 intent.putExtra() 并在 onCreate() 中调用 getIntent().getExtras().getInt("point") 但是没有这样的数据
  • 使用 onSaveInstanceState() 和 onRestoreInstanceState() 但 savedInstanceState 为空

请告诉我如何在 Twitter 回调后保留此数据。我可以使用数据库或共享首选项或类似的东西,但还有其他方法吗?

提前致谢。

编辑:

当程序转到 twitter 并返回时,它会再次从 onCreate() 开始,就像方向改变时一样。当方向改变时,“Bundle savedInstanceState”有值(value),但在我的例子中没有值(value)。

在 twitter 回调返回后的第二次运行 onCreate() 中,我如何获取我之前手动设置的 savedInstanceState?

编辑 2:

这个网站的某些人真的很奇怪。我将下面的答案作为新帖子发布,但有人删除了它,声称“新帖子应该包含答案”。你知道吗,那篇文章有真正的答案。不要在没有阅读所有内容的情况下这样做。我将其作为编辑写在下面。

非常感谢您的回答 (@rod_torres)。我已经尝试过你的解决方案(有和没有 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)),在这两种情况下我都无法实现。设置singleTop时的生命周期如下;

onCreate() -> 推特 -> onCreate()

从 Twitter 返回后未调用 onNewIntent()。该 Activity 已重新创建为一个新实例,因此我可以按上面的顺序使用后退按钮返回。

我尝试使用 singleTask 并且它有效(我的问题的答案是这样的,对于那些没有阅读这部分就删除了我的帖子的人)。它没有创建 Activity 的新实例,并且调用了 onNewIntent()。当我单击后退按钮时,我被重定向到我的应用程序的先前 Activity ,而不是浏览器(Twitter)的任务,尽管 Twitter 是先前的 Activity 。流程就像;

onCreate() -> Twitter -> onCreate(with bundles) -> onNewIntent()

Activity A -> Activity B -> Twitter -> Activity B(同上)

当我从 Activity B 返回时;

Activity A -> 浏览器

似乎 singleTask 模式将我的应用程序的任务带到前台,其中包含所有 Activity ,并将其他应用程序(浏览器)的任务带到后台。我对吗?

但我仍然不明白为什么您的解决方案对我不起作用。我已经阅读了很多关于此的文档,我认为它应该已经奏效了。

此外,我不确定是否应该使用 singleTask。可能有什么我还没有考虑到的问题,有什么缺点吗?

最佳答案

正如您在编辑中指出的那样, Activity 已重新创建。为了使应用程序不重新创建 Activity ,请在 list 中将参数 launchMode 的值为“singleTop”添加到您将使用 twitter4j 的 Activity

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

此外,当您调用该 Activity 时,添加标志 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

关于Android 数据在 startActivity() 回调后 onCreate() 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29872470/

相关文章:

android - Firebase updatechildren 与 setvalue

java - Twitter API - 使用 t.co 缩短推文文本

android - Application.ActivityLifecycleCallbacks 是否在 Activity 中的生命周期方法之前被同步调用?

android - onBackPressed() 是否停止应用程序?

android - AsyncListDiffer 没有更新 recyclerview

java - 仅java.runtimeException API 19至15

android - android系统中各种音源有什么区别?

java - 如何在不暴露我的 oauth secret token 的情况下在开源中使用 Twitter4J?

java - 如何从推文中仅提取英文标签