【问题标题】:Android data is lost onCreate() after startActivity() for callbackAndroid 数据在 startActivity() 回调后丢失 onCreate()
【发布时间】:2015-04-26 00:54:50
【问题描述】:

我有一个通过 twitter4j 连接到 twitter 的 android 应用程序。在一个活动中,有一个分享按钮和一个 TextView。流程如下;

  1. 用户打开活动开始 onCreate() 填充 文本视图
  2. 用户点击“分享”
  3. 为 oAuth 启动 Twitter 活动,用户类型帐户 凭据并授予我的应用权限
  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()
  • 在 startActivity() 之前使用 intent.putExtra() 并在 onCreate() 中调用 getIntent().getExtras().getInt("point") 但没有此类数据
  • 使用 onSaveInstanceState() 和 onRestoreInstanceState() 但 savedInstanceState 为 null

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

提前致谢。

编辑:

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

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

编辑 2:

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

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

onCreate() -> Twitter -> onCreate()

从 Twitter 回来后没有调用 onNewIntent()。该活动被重新创建为一个新实例,因此我可以按上述顺序使用后退按钮返回。

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

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

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

当我从活动 B 回来时;

活动 A -> 浏览器

似乎 singleTask 模式将我的应用程序的任务和所有活动都带到了前台,并将其他应用程序的(浏览器)任务带到了后台堆栈。我对吗?

但我仍然无法理解为什么您的解决方案对我不起作用。我已经阅读了很多关于这方面的文档,我认为它应该已经工作了。

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

【问题讨论】:

    标签: android twitter4j android-lifecycle activity-lifecycle datapersistance


    【解决方案1】:

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

    <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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      相关资源
      最近更新 更多