RecyclerView Adapter调用startActivity报FLAG_ACTIVITY_NEW_TASK错误
问题描述
在项目中使用RecyclerView组件,尝试在Adapter中启动新Activity时抛出如下错误:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
相关实现代码如下:
- Adapter成员变量定义
private Context mContext;
- Adapter构造函数
public EntitiesListAdapter(ArrayList<Entity> myDataset, Context context) { mDataset = myDataset; mContext = context; }
- 列表项点击跳转逻辑
holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, ViewEntityActivity.class); Bundle bundle = new Bundle(); bundle.putParcelable("entity", row); mContext.startActivity(intent); } });
- Adapter初始化代码
RecyclerView.Adapter<EntitiesListAdapter.MyViewHolder> mAdapter = new EntitiesListAdapter(entities, getApplicationContext());
尝试过修改Context成员变量名、替换传入的普通Context替换getApplicationContext(),问题仍然存在。
根本原因
抛出这个异常的核心判定逻辑是:调用startActivity()的Context对象不是Activity类型的上下文。
- 最初传入的
getApplicationContext()是应用全局级别的Context,不属于Activity上下文,必然触发该异常。 - 后续替换Context后问题仍存在,说明传入的依然不是Activity类型的上下文(比如传入了Application实例、其他非Activity场景获取的Context)。
- 额外代码疏漏:代码中创建了Bundle存储实体数据,但没有将Bundle传入Intent,跳转后目标页面无法获取到要传递的entity参数。
修复方案
方案1:传入Activity上下文(推荐)
初始化Adapter时,直接传入当前绑定的Activity实例作为Context参数,不要使用应用级Context:
// 假设RecyclerView是在对应业务Activity中初始化,直接传入当前Activity实例即可 RecyclerView.Adapter<EntitiesListAdapter.MyViewHolder> mAdapter = new EntitiesListAdapter(entities, YourHostActivity.this);
该方案符合Android常规页面跳转的任务栈管理规则,不需要额外修改Intent配置。
方案2:给Intent添加新任务栈标记(仅特殊场景使用)
如果业务场景下确实只能拿到非Activity类型的Context,需要给Intent添加FLAG_ACTIVITY_NEW_TASK标记,将新启动的Activity放到新的任务栈中:
holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, ViewEntityActivity.class); // 添加新任务栈标记 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle bundle = new Bundle(); bundle.putParcelable("entity", row); // 补上遗漏的Bundle传参逻辑 intent.putExtras(bundle); mContext.startActivity(intent); } });
注意:该方案会改变Activity的任务栈归属,从普通页面跳转流程中脱离,非必要不使用。
内容的提问来源于stack exchange,提问作者Nelson Lopes
相关产品推荐
相关产品推荐

