在Activity上下文之外启动新的Activity。

7

我尝试在我的AsyncTask类(onPostExecute())中启动一个Activity并关闭其他Activity。

我的代码:

Intent i = new Intent(parentActivity, ThunderHunter.class);
c.startActivity(i);
parentActivity.finish();

但它不起作用,logcat 显示:

08-01 18:01:27.640: E/AndroidRuntime(12398): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.app.ContextImpl.startActivity(ContextImpl.java:1029)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.app.ContextImpl.startActivity(ContextImpl.java:1023)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.content.ContextWrapper.startActivity(ContextWrapper.java:283)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at com.radzik.thunter.FunkcjeAPI$Logowanie.onPostExecute(FunkcjeAPI.java:151)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at com.radzik.thunter.FunkcjeAPI$Logowanie.onPostExecute(FunkcjeAPI.java:1)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.os.AsyncTask.finish(AsyncTask.java:631)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.os.Looper.loop(Looper.java:137)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at android.app.ActivityThread.main(ActivityThread.java:4898)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at java.lang.reflect.Method.invoke(Method.java:511)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
08-01 18:01:27.640: E/AndroidRuntime(12398):    at dalvik.system.NativeStart.main(Native Method)

所以我将代码更改为以下内容:
Intent i = new Intent(context, ThunderHunter.class);
c.startActivity(i);
parentActivity.finish();

但是没有达到预期的结果(仍然是同样的错误)。

有没有正确的方式?


上下文指您想要调用新活动的活动,因此请尝试使用以下代码:Intent i = new Intent(YourActivity.this(或getApplicationContext()),ThunderHunter.class); - Tobiel
3个回答

22

logcat在第一行告诉您问题所在。

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag

添加那个标记

Intent i = new Intent(context, ThunderHunter.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
c.startActivity(i);
parentActivity.finish();

您可以在文档这里获取所有可用的意图标志(Intent Flags)列表。


为什么需要使用此标志文档说:“如果设置,此活动将成为此历史堆栈上新任务的开始。”因此,实际问题在于使用的不是Activity Context。 - Yevgen Kulik
@YevgenKulik 根据情况,那可能是问题所在。但有时“Activity Context”不可用。 - codeMagic

3

添加 Intent.FLAG_ACTIVITY_NEW_TASK 将解决您的错误,但请确保您是否需要此标志,因为它将触发活动作为新任务,在您的场景中可能不需要。

为了避免使用这个标志,您可以在主要的 Activity 中编写一个 Handler 并在 onPostExecute() 中调用它。


1
你能给一个更完整的例子吗? - jesses.co.tt

2

try this-

Intent i = new Intent(context, ThunderHunter.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
parentActivity.finish();

您正在活动上下文之外调用新的活动,因此您需要设置标志并将上下文传递到活动之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接