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)
声明