getExtras()在后退导航时返回null

时间:2016-06-18 10:20:48

标签: java android

所以,我正在开始@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(MainActivity.this, SecondActivity.class); Bundle bundle = new Bundle(); bundle.putString("testString", "TestString"); i.putExtras(bundle); startActivity(i); } }); } 有以下代码。

ScondActivity.java

我的@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String s = getIntent().getExtras().getString("testString"); Log.v(SecondActivity.class.getSimpleName(), s); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(SecondActivity.this, ThirdActivity.class); Bundle bundle = new Bundle(); bundle.putString("testString", "TestString"); i.putExtras(bundle); startActivity(i); } }); } 有以下代码。

ThirdActivity.java

我的@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); String s = getIntent().getExtras().getString("testString"); Log.v(ThirdActivity.class.getSimpleName(), s); } 有以下代码。

ThirdActivity.java

当我运行这个应用程序时,一切正常。但是当我从SecondActivity.java回到NullPointerException时,我String s = getIntent().getExtras().getString("testString");正在 Fatal error: Uncaught Twig_Error_Syntax: Unexpected token "punctuation" of value "." ("end of statement block" expected) in "content_cp/home/menue.html" at line 1. in /home/test/Twig/lib/Twig/TokenStream.php on line

我如何克服这个问题?

任何可能的帮助都可以非常明显。

4 个答案:

答案 0 :(得分:2)

您收到此错误是因为使用Intent从一个活动传递到另一个活动的数据是临时的,并且在您切换到另一个活动时会被销毁。 当您从SecondActivity切换到ThirdActivity时,FirstActivity的额外内容将被销毁。此问题的替代方法是您可以将这些额外内容存储在共享首选项中。使用共享首选项可以将数据保存到本地存储,并且可以在每个活动中使用。 可以找到共享偏好指南here

答案 1 :(得分:1)

您可以使用活动生命周期方法中的onSaveInstanceState()来解决此问题。请查看以下网址:https://developer.android.com/training/basics/activity-lifecycle/recreating.html

我提供的链接中的一段:

  

当您的活动因用户按下Back或活动自行完成而被销毁时,该Activity实例的系统概念将永远消失,因为该行为表明不再需要该活动。但是,如果系统由于系统约束(而不是正常的应用程序行为)而破坏活动,那么虽然实际的Activity实例已经消失,但系统会记住它存在,如果用户导航回它,系统会创建一个新的活动的实例,使用一组保存的数据来描述销毁时的活动状态。系统用于恢复先前状态的已保存数据称为"实例状态"并且是存储在Bundle对象中的键值对的集合。

     

...

     

要保存有关活动状态的其他数据,必须覆盖onSaveInstanceState()回调方法。系统在用户离开您的活动时调用此方法,并将其传递给Bundle对象,该对象将在您的活动意外销毁时保存。如果系统必须稍后重新创建活动实例,它会将相同的Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

因此,您可以使用onSaveInstanceState()和作为onCreate(或onRestoreInstanceState)参数传递的Bundle,而不是创建自己的共享首选项。

答案 2 :(得分:0)

在Second and Tird Activity

中更改以下代码中的onCreate方法
with()

答案 3 :(得分:0)

在第二个活动中,将s声明为实例变量。

String s;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    s = getIntent().getExtras().getString("testString");
    Log.v(SecondActivity.class.getSimpleName(), s);

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(SecondActivity.this, ThirdActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("testString", "TestString");
            i.putExtras(bundle);
            startActivity(i);
        }
    });
}

代码从上到下读取,分配给该特定方法内的变量的值只会持续到指针到达该方法onCreate的最后一个大括号。点击监听器可以随时发生,具体取决于用户,当时该值不再存在,因此您获得空值。

将值分配给Instance变量将持续到该实例生命周期。因此,该变量的任何使用都将保证恢复之前分配的某个值。

还要考虑当您的活动在后台时没有足够的内存时,操作系统可能会终止活动(从活动堆栈中退出)。如果发生这种情况,使用onSaveInstanceState(Bundle outState)会更安全。