【问题标题】:Start new Activity outside the Activity context.在 Activity 上下文之外启动新的 Activity。
【发布时间】:2013-08-01 16:06:40
【问题描述】:

我尝试在我的 AsyncTask 类 (onPostExecute()) 中启动一个 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();

但没有异常结果(仍然是同样的错误)。

有什么办法可以正确吗?

【问题讨论】:

  • context 表示您想调用新的活动,所以试试这个 Intent i = new Intent(YourActivity.this(or getApplicationContext()), ThunderHunter.class);

标签: android android-intent android-asynctask android-activity runtime-error


【解决方案1】:

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 Flagshere in the docs的列表

【讨论】:

  • 为什么需要使用这个标志文档说:“如果设置,这个活动将成为这个历史堆栈上一个新任务的开始。”所以问题实际上是在使用 not Activity Context。
  • @YevgenKulik 视情况而定,这可能是问题所在。但有时Activity Context 不可用。
【解决方案2】:

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

为了避免这个标志,你可以在主Activity中写一个Handler并在onPostExecute()中调用它

【讨论】:

  • 你能举一个更完整的例子吗?
【解决方案3】:

试试这个-

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

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

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2013-09-22
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多