Java getExtras()在返回导航时返回null

Java getExtras()在返回导航时返回null,java,android,Java,Android,因此,我开始MainActivity.java有以下代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener

因此,我开始
MainActivity.java
有以下代码

@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);
        }
    });
}
@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);
        }
    });
}
@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);
}
我的
ScondActivity.java
有以下代码

@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);
        }
    });
}
@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);
        }
    });
}
@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
有以下代码

@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);
        }
    });
}
@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);
        }
    });
}
@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
时,我在
String s=getIntent().getExtras().getString(“testString”)上得到了
NullPointerException

我如何克服这个问题


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

您会收到此错误,因为使用
Intent
从一个活动传递到另一个活动的数据是临时的,并且在切换到另一个活动时会被销毁。 当您从SecondActivity切换到ThirdActivity时,FirstActivity中的多余部分将被销毁。解决此问题的另一种方法是,您可以将这些附加项存储在共享首选项中。使用共享首选项将数据保存到本地存储,并且在每个活动中都可用。
共享首选项指南可在中找到

您会遇到此错误,因为使用
Intent
从一个活动传递到另一个活动的数据是临时的,并且在切换到另一个活动时会被销毁。 当您从SecondActivity切换到ThirdActivity时,FirstActivity中的多余部分将被销毁。解决此问题的另一种方法是,您可以将这些附加项存储在共享首选项中。使用共享首选项将数据保存到本地存储,并且在每个活动中都可用。
共享首选项指南可在Second和Tird活动的代码下方找到

更改onCreate方法

  String s = "";
  if(getIntent().getExtras() != null)
   {
        s = getIntent().getExtras().getString("testString");
        Log.v(SecondActivity.class.getSimpleName(), s);
   }

在Second和Tird活动中更改下面代码中的onCreate方法

  String s = "";
  if(getIntent().getExtras() != null)
   {
        s = getIntent().getExtras().getString("testString");
        Log.v(SecondActivity.class.getSimpleName(), s);
   }

您可以使用活动生命周期方法中的onSaveInstanceState()来解决此问题。请查看以下URL:

我提供的链接中的一段:

当您的活动因用户按下或活动本身完成而被销毁时,系统对该活动实例的概念将永远消失,因为该行为表明不再需要该活动。但是,如果系统由于系统约束(而不是正常的应用程序行为)而销毁活动,那么尽管实际的活动实例已不存在,但系统会记住它的存在,因此如果用户导航回它,系统使用一组保存的数据创建活动的新实例,这些数据描述了活动被销毁时的状态。系统用于恢复以前状态的保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合

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


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

您可以使用活动生命周期方法中的onSaveInstanceState()来解决此问题。请查看以下URL:

我提供的链接中的一段:

当您的活动因用户按下或活动本身完成而被销毁时,系统对该活动实例的概念将永远消失,因为该行为表明不再需要该活动。但是,如果系统由于系统约束(而不是正常的应用程序行为)而销毁活动,那么尽管实际的活动实例已不存在,但系统会记住它的存在,因此如果用户导航回它,系统使用一组保存的数据创建活动的新实例,这些数据描述了活动被销毁时的状态。系统用于恢复以前状态的保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合

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


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

在第二个活动中,将
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的最后一个大括号为止。单击侦听器可以在任何时刻发生,具体取决于用户。当然,到那时,该值不再有效,因此您将得到一个空值

为实例变量赋值将持续到该实例的生命周期。因此,该变量的任何使用都将保证恢复刚才分配的特定值


请考虑,当活动在后台时内存不足时,操作系统可能会杀死活动(从活动堆栈中排队)。如果发生这种情况,在第二个活动中使用
onSaveInstanceState(Bundle outState)
声明