在回调的startActivity()之后,Android数据在onCreate()上丢失

时间:2015-04-26 00:54:51

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

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

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

    我的问题是,在第二次onCreate()之后,TextView的值会丢失。

    - 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"有价值但在我的情况下没有价值。

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

    编辑2:

    这个网站的一些人真的很奇怪。我在下面发布了一个新帖子的答案,但有人删除了它声称"新帖子应该包括答案"。你知道吗,该帖子有真正的答案。如果不阅读全部内容,请不要这样做。我将以下内容写为编辑。

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

    onCreate() - > Twitter - > onCreate()

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

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

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

    活动A - >活动B - > Twitter - >活动B(与之前相同)

    当我从活动B回来时;

    活动A - >浏览器

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

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

    另外,我不确定是否应该使用singleTask。可能有什么问题我还没有考虑到,有什么不利之处吗?

1 个答案:

答案 0 :(得分:1)

正如您在编辑中指出的那样,重新创建了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