Activity 在过渡到新的过程中被重新创建
Activity gets re-created during the transition to a new one
在我正在开发的应用程序中,我有 2 个活动,ActA 和 ActB。
ActA 是第一个显示的。
我们可以说 ActA 像 SplashScreen 一样工作。
在 ActA 中,我检索了一些我在 ActB 中执行某些任务所需的数据。
检索到此数据后,我可以调用执行切换到 ActB.
的 Intent
问题来了:
ActB 扩展了 ActA 因为它需要 ActA 检索数据来执行他的任务。
可能正因为如此,在 ActB 被调用的那一刻,ActA 方法 "OnCreate" 被调用。
这会创建一个循环,因为 ActA 开始检索其他数据并再次调用 ActB。所以我的应用程序崩溃了。
如何禁止ActA再次启动?
您可以通过意图将检索到的数据从 ActA 传递到 ActB,就像这样
Intent i = new Intent(getActivity(), ActB.class);
i.putExtra("String1", "foo");
i.putExtra("Integer1", "1337");
startActivity(i);
然后在您的 ActB 中,您像这样查看数据:
Intent i = getIntent();
String foo = i.getStringExtra("String1");
Integer leet = i.getStringExtra("Integer1");
如果要传递自定义对象,请参考How to send an object from one Android Activity to another using Intents?
如果您不想在 Activity 之间交换数据,您可以这样做。
像这样创建一个基础activity:
class BaseActivity extends Activity{
String data;
}
Now class ActA extends BaseActivity{
//you can put value to data directly
data="ABCD";
}
class ActB extends BaseActivity{
//Here you can access the data string directly
}
发生这种情况是因为ActB 的onCreate() 方法正在调用super(),它导致一次又一次地调用ActA 的onCreate() 方法。所以,最好不要在 ActB 中扩展 ActA。
您可以通过从 ActA 到 ActB 的传递意图传递这些值。
首先,您需要温习一下 OOP 概念。
正如你所说 ActA 更像是 SplashScreen
,所以我假设 ActB 是 MainScreen
.您不应该 extend
ActA 来创建 ActB。他们之间没有Is-A
关系
Here's the problem: ActB extends ActA because it needs ActA's retrieved data to perform it's tasks.
您出于非常错误的原因延长了 ActA。
展望未来,我假设(因为您没有提供任何代码)您已经编写了在 ActA[=63= 中开始 ActB 的代码]的onCreate()
方法,这就是问题
的原因
This creates a loop because ActA starts retrieving other data and calls again ActB. So my app crashes.
请注意,由于您的结构,一旦 ActB 第一次启动,它就是检索数据并调用自身的那个 而不是 ActA.
请删除继承并使用 Intent.putExtra(key, value)
方法 (docs) 将数据从 ActA 传递到 ActB .
例如在 ActA 检索后 some_data
Intent i = new Intent(ActA.this, ActB.class);
i.putExtra("some_key", some_data);
ActA.this.startActivity(i);
并且在 ActB 中需要数据
Intent i = getIntent();
并使用适当的 API Intent.get<TYPE>Extra()
从 i
检索 some_data
,例如i.getIntExtra("some_key")
(docs)
它会起作用。
另请参考@Malik 的回答。
在我正在开发的应用程序中,我有 2 个活动,ActA 和 ActB。
ActA 是第一个显示的。
我们可以说 ActA 像 SplashScreen 一样工作。
在 ActA 中,我检索了一些我在 ActB 中执行某些任务所需的数据。
检索到此数据后,我可以调用执行切换到 ActB.
的 Intent问题来了: ActB 扩展了 ActA 因为它需要 ActA 检索数据来执行他的任务。
可能正因为如此,在 ActB 被调用的那一刻,ActA 方法 "OnCreate" 被调用。
这会创建一个循环,因为 ActA 开始检索其他数据并再次调用 ActB。所以我的应用程序崩溃了。
如何禁止ActA再次启动?
您可以通过意图将检索到的数据从 ActA 传递到 ActB,就像这样
Intent i = new Intent(getActivity(), ActB.class);
i.putExtra("String1", "foo");
i.putExtra("Integer1", "1337");
startActivity(i);
然后在您的 ActB 中,您像这样查看数据:
Intent i = getIntent();
String foo = i.getStringExtra("String1");
Integer leet = i.getStringExtra("Integer1");
如果要传递自定义对象,请参考How to send an object from one Android Activity to another using Intents?
如果您不想在 Activity 之间交换数据,您可以这样做。
像这样创建一个基础activity:
class BaseActivity extends Activity{
String data;
}
Now class ActA extends BaseActivity{
//you can put value to data directly
data="ABCD";
}
class ActB extends BaseActivity{
//Here you can access the data string directly
}
发生这种情况是因为ActB 的onCreate() 方法正在调用super(),它导致一次又一次地调用ActA 的onCreate() 方法。所以,最好不要在 ActB 中扩展 ActA。 您可以通过从 ActA 到 ActB 的传递意图传递这些值。
首先,您需要温习一下 OOP 概念。
正如你所说 ActA 更像是 SplashScreen
,所以我假设 ActB 是 MainScreen
.您不应该 extend
ActA 来创建 ActB。他们之间没有Is-A
关系
Here's the problem: ActB extends ActA because it needs ActA's retrieved data to perform it's tasks.
您出于非常错误的原因延长了 ActA。
展望未来,我假设(因为您没有提供任何代码)您已经编写了在 ActA[=63= 中开始 ActB 的代码]的onCreate()
方法,这就是问题
This creates a loop because ActA starts retrieving other data and calls again ActB. So my app crashes.
请注意,由于您的结构,一旦 ActB 第一次启动,它就是检索数据并调用自身的那个 而不是 ActA.
请删除继承并使用 Intent.putExtra(key, value)
方法 (docs) 将数据从 ActA 传递到 ActB .
例如在 ActA 检索后 some_data
Intent i = new Intent(ActA.this, ActB.class);
i.putExtra("some_key", some_data);
ActA.this.startActivity(i);
并且在 ActB 中需要数据
Intent i = getIntent();
并使用适当的 API Intent.get<TYPE>Extra()
从 i
检索 some_data
,例如i.getIntExtra("some_key")
(docs)
它会起作用。
另请参考@Malik 的回答。