在 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK
Posted
技术标签:
【中文标题】在 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK【英文标题】:Calling startActivity() outside of an Activity context requires FLAG_ACTIVITY_NEW_TASK 【发布时间】:2019-07-17 10:40:46 【问题描述】:我收到错误 androidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag
。完整的堆栈跟踪:
main Process: com.kd.book, PID: 3487 android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? at android.app.ContextImpl.startActivity(ContextImpl.java:1238) at android.app.ContextImpl.startActivity(ContextImpl.java:1225) at com.kd.book.Adapter.MyComicAdapter$1.onClick(MyComicAdapter.java:63) at com.kd.book.Adapter.MyComicAdapter$MyViewHolder.onClick(MyComicAdapter.java:99)
我是 Android 开发新手,不知道如何解决。
我的代码:
public class MyComicAdapter extends RecyclerView.Adapter<MyComicAdapter.MyViewHolder>
Context context;
List<Comic> comicList;
LayoutInflater inflater;
public MyComicAdapter(Context context, List<Comic> comicList)
this.context = context;
this.comicList = comicList;
inflater=LayoutInflater.from(context);
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
View itemView = inflater.inflate(R.layout.comic_item, viewGroup, false);
return new MyViewHolder(itemView);
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i)
Picasso.get().load(comicList.get(i).Image).into(myViewHolder.comic_image);
myViewHolder.comic_name.setText(comicList.get(i).Name);
//Event
myViewHolder.setRecyclerItemClickListener(new IRecyclerItemClickListener()
@Override
public void onClick(View view, int position)
//save the comic selected
Common.comicSelected = comicList.get(position);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(new Intent(context,ChapterActivity.class));
);
@Override
public int getItemCount()
return comicList.size();
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
TextView comic_name;
ImageView comic_image;
IRecyclerItemClickListener recyclerItemClickListener;
public void setRecyclerItemClickListener(IRecyclerItemClickListener recyclerItemClickListener)
this.recyclerItemClickListener = recyclerItemClickListener;
public MyViewHolder(@NonNull View itemView)
super(itemView);
comic_image = itemView.findViewById(R.id.image_comic);
comic_name = itemView.findViewById(R.id.comic_name);
itemView.setOnClickListener(this);
@Override
public void onClick(View view)
recyclerItemClickListener.onClick(view, getAdapterPosition());
有什么想法吗?
【问题讨论】:
这里是我的 logcat 详细信息 致命异常:主进程:com.kd.book,PID:3487 android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?在 android.app.ContextImpl.startActivity(ContextImpl.java:1238) 在 android.app.ContextImpl.startActivity(ContextImpl.java:1225) 在 com.kd.book.Adapter.MyComicAdapter$1.onClick(MyComicAdapter.java:63)在 com.kd.book.Adapter.MyComicAdapter$MyViewHolder.onClick(MyComicAdapter.java:99) @K.DKamalDhital,使用这个view.getContext().startActivity(new Intent(context,ChapterActivity.class));
@K.DKamalDhital,你为什么创建myViewHolder.setRecyclerItemClickListener
,你到底想做什么?你能解释一下这将有助于我们解决你的问题吗?
【参考方案1】:
试试这个方法, 1. 在您的适配器中创建一个接口并将位置传递给它(希望您知道如何制作和使用接口)。 2. 为您的活动类实现该接口。 3. 在它的 override 方法中,你会得到一个列表的位置。 4. 通过使用该位置,获取所需的数据并在其中调用意图。 完成。
【讨论】:
公共接口 IRecyclerItemClickListener void onClick(View view, int position); 这里不工作是主要问题 myViewHolder.setRecyclerItemClickListener(new IRecyclerItemClickListener() @Override public void onClick(View view, int position) //保存选中的漫画 Common.comicSelected = comicList.get (位置); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(new Intent(context,ChapterActivity.class)); 好的,在你的startActivity中,你需要传递一个intent对象而不是newIntent。【参考方案2】:如下改变你对新活动的调用,
Intent intent=new Intent(context, ChapterActivity.class);
Activity activity=(Activity) context;
activity.startActivity(intent);
【讨论】:
java.lang.ClassCastException: android.app.ContextImpl 不能在 com.kd.book.Adapter.MyComicAdapter$1.onClick(MyComicAdapter.java:61) 在 com.kd.book.Adapter.MyComicAdapter$1.onClick(MyComicAdapter.java:61) .kd.book.Adapter.MyComicAdapter$MyViewHolder.onClick(MyComicAdapter.java:98) 我在那个代码之后遇到了这个问题。【参考方案3】:问题是你做了两次“new Intent”:
在这里:Intent intent = new Intent(Intent.ACTION_VIEW);
第二次来这里:context.startActivity(new Intent(context,ChapterActivity.class))
活动开始时未设置FLAG_ACTIVITY_NEW_TASK。仅创建一次 Intent 的更正版本如下所示:
Intent intent = new Intent(context, ChapterActivity.class))
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
但您真正的问题是您需要在 Activity 上下文中调用 startActivity。
getActivity().startActivity(new Intent(getActivity(), ChapterActivity.class));
更多讨论在这里: How do I start an activity from within a Fragment?
您尝试对 FLAG_ACTIVITY_NEW_TASK 执行的操作应保留在极少数情况下,例如您需要从服务启动 Activity 时。但在从 UI 上下文中启动 Activity 时,没有必要或不需要设置该标志。
这就是警告要求的原因:
这真的是你想要的吗?
在启动 Activity 时设置专门的标志通常会导致不需要的回栈/导航行为。
另外,我看不到您的适配器是否位于 Activity 或 Fragment 中。 [您可以在 Acitivity 中使用“this”,在 Fragment 中使用 getActivity()]
最后,我不知道您是如何创建适配器的,但是您的代码当前的组织方式需要将 Activity 上下文传递到适配器中以使其工作。从一个片段:
adapter = new MyComicAdapter(getActivity(), list);
来自活动:
adapter = new MyComicAdapter(this, list);
这很可能会阻止您遇到的异常。
【讨论】:
意图意图=新意图(意图.ACTION_VIEW);意图.addFlags(意图.FLAG_ACTIVITY_NEW_TASK);你在谈论它吗? 我在答案的底部添加了一个示例。干杯。以上是关于在 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Activity 和 Fragment 之外的权限请求?