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);