Android Context.startActivity(Intent) 抛出运行时异常
Android Context.startActivity(Intent) throws runtime exception
我在 Google Play 上的宠物 Android 应用程序崩溃,Google Play 控制台的堆栈跟踪未显示异常错误消息。我对 startActivity 调用如何抛出运行时异常感到困惑。
android.util.AndroidRuntimeException:
at android.app.ContextImpl.startActivity (ContextImpl.java:922)
at android.app.ContextImpl.startActivity (ContextImpl.java:898)
at android.content.ContextWrapper.startActivity (ContextWrapper.java:389)
at com.muchen.tweetstormmaker.views.DraftAdapter$DraftViewHolder.lambda$new[=12=] (DraftAdapter.java:8)
at com.muchen.tweetstormmaker.views.-$$Lambda$DraftAdapter$DraftViewHolder$XO1lmnEfxZyiTl39GhDThT2OKHw.onClick (-.java:2)
at android.view.View.performClick (View.java:6608)
at android.view.View.performClickInternal (View.java:6585)
at android.view.View.access00 (View.java:785)
at android.view.View$PerformClick.run (View.java:25921)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:201)
at android.app.ActivityThread.main (ActivityThread.java:6810)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)
这是调用 startActivity 的代码段。我看不出有什么问题。
itemView.setOnClickListener((view)->{
Intent intent = new Intent(context, DraftEditActivity.class);
intent.putExtra(Constants.EXTRA_DRAFT_ID,
drafts.get(getAdapterPosition()).getDraftId());
context.startActivity(intent);
});
封闭 java class 的代码在这里:https://github.com/mchen118/tweetstorm-maker-android-java/blob/issue_1/app/src/main/java/com/muchen/tweetstormmaker/views/DraftAdapter.java
startActivity()
可以像这样抛出一个 AndroidRuntimeException
:
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
context
,显然,并不总是 Activity
。
而且,事实上,根据我回答这个问题时您的 master
分支代码,它不是 Activity
。您似乎是通过以下方式创建它的:
draftAdapter = new DraftAdapter(getApplicationContext());
只有在知道为什么要使用 Application
时才使用 getApplicationContext()
。而且,一般来说,对于 UI 问题,始终使用 Activity
作为 Context
:
draftAdapter = new DraftAdapter(this);
我在 Google Play 上的宠物 Android 应用程序崩溃,Google Play 控制台的堆栈跟踪未显示异常错误消息。我对 startActivity 调用如何抛出运行时异常感到困惑。
android.util.AndroidRuntimeException:
at android.app.ContextImpl.startActivity (ContextImpl.java:922)
at android.app.ContextImpl.startActivity (ContextImpl.java:898)
at android.content.ContextWrapper.startActivity (ContextWrapper.java:389)
at com.muchen.tweetstormmaker.views.DraftAdapter$DraftViewHolder.lambda$new[=12=] (DraftAdapter.java:8)
at com.muchen.tweetstormmaker.views.-$$Lambda$DraftAdapter$DraftViewHolder$XO1lmnEfxZyiTl39GhDThT2OKHw.onClick (-.java:2)
at android.view.View.performClick (View.java:6608)
at android.view.View.performClickInternal (View.java:6585)
at android.view.View.access00 (View.java:785)
at android.view.View$PerformClick.run (View.java:25921)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:201)
at android.app.ActivityThread.main (ActivityThread.java:6810)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)
这是调用 startActivity 的代码段。我看不出有什么问题。
itemView.setOnClickListener((view)->{
Intent intent = new Intent(context, DraftEditActivity.class);
intent.putExtra(Constants.EXTRA_DRAFT_ID,
drafts.get(getAdapterPosition()).getDraftId());
context.startActivity(intent);
});
封闭 java class 的代码在这里:https://github.com/mchen118/tweetstorm-maker-android-java/blob/issue_1/app/src/main/java/com/muchen/tweetstormmaker/views/DraftAdapter.java
startActivity()
可以像这样抛出一个 AndroidRuntimeException
:
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
context
,显然,并不总是 Activity
。
而且,事实上,根据我回答这个问题时您的 master
分支代码,它不是 Activity
。您似乎是通过以下方式创建它的:
draftAdapter = new DraftAdapter(getApplicationContext());
只有在知道为什么要使用 Application
时才使用 getApplicationContext()
。而且,一般来说,对于 UI 问题,始终使用 Activity
作为 Context
:
draftAdapter = new DraftAdapter(this);