在 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

如何处理 Activity 和 Fragment 之外的权限请求?

android. 当启动一个activity并且完后需要返回到启动他的activity来执行的回调函数是?

上下文或活动之外的 getString

在模拟上下文之外调用 WCF 服务?

Android:调用 Activity 时应用程序关闭。意图,上下文,字符串[重复]