从Activity上下文外调用startActivity()

我已经在我的Android应用程序中实现了一个ListView 。 我使用ArrayAdapter类的自定义子类绑定到此ListView 。 在重写的ArrayAdapter.getView(...)方法中,我分配了一个OnClickListener 。 在OnClickListeneronClick方法中,我想启动一个新的活动。 我得到的例外:

 Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 

我怎样才能得到ListView (当前Activity )正在工作的Context

  • 通过适配器中的构造函数cachingContext对象,或者
  • 从你的angular度来看。

或者作为最后的手段,

  • 添加 – FLAG_ACTIVITY_NEW_TASK标志为您的意图:

_

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

编辑 – 我会避免设置标志,因为它会干扰事件和历史堆栈的正常stream量。

我用“ addFlags ”来代替“setFlags”

 myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

根据它的文件 :

为意图添加额外的标志(或与现有的标志值)。

编辑

请注意,如果您使用的标志,您更改历史堆栈Alex Volovoy的答案说:

…避免设置标志,因为它会干扰事件和历史堆栈的正常stream动。

而不是使用(getApplicationContext)使用YourActivity.this

如果因为使用下面的创buildselect器而出现错误:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); startActivity(Intent.createChooser(sharingIntent, "Open With")); 

设置标志来创build像这样的select器:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(chooserIntent); 

我想也许你在错误的地方实现了OnClickListener–通常你应该在你的Activity中实现一个OnItemClickListener,并将它设置在ListView上,否则你的事件会遇到问题。

另外:如果你在链表中显示链接的片段 ,不要像这样创build它

  adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings); 

反而打电话

  adapter = new ListAdapter(getActivity(),mStrings); 

适配器在两种情况下工作正常,但链接只在最后一个工作。

 CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist); 

要么

 Context mContext = getAppliactionContext(); CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist); 

改变到下面

 CustomAdapter mAdapter = new CustomAdapter( this, yourlist); 

看,如果你正在一个方法中创build一个listiner内的意图

 override onClick (View v). 

然后通过这个视图调用上下文:

 v.getContext () 

甚至不需要SetFlags …

即使从活动调用StartActivity, Xamarin.Android(MonoDroid)上的任何人都可以获得这个 – 实际上这是Xamarin在新ART运行时的bug,请参阅https://bugzilla.xamarin.com/show_bug.cgi?id=17630

在我看来,最好是在Activity.class的代码中使用startActivity()的方法。 如果你在Adapter或其他类中使用它,就会导致这种情况。

当起始活动不知道他的活动是什么时,就会出现这个错误。 所以你必须在startActivity()之前添加活动

你必须设置

 activity.startActivity(yourIntent); 

详细阐述Alex Volovoy的答案 –

如果你得到这个问题的片段,getActivity()工作正常,以获得上下文

在其他情况下:

如果你不想使用 –

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend 

然后在你的OutsideClass中做一个像这样的函数 –

 public void gettingContext(Context context){ real_context = context;//where real_context is a global variable of type Context } 

现在,在你的主要活动中,当你定义OutsideClass后,立即调用上面的方法来创build一个新的OutsideClass,并将活动的上下文作为参数。 另外在你的主要活动中,

 public void startNewActivity(final String activity_to_start) { if(activity_to_start.equals("ACTIVITY_KEY")); //ACTIVITY_KEY-is a custom key,just to //differentiate different activities Intent i = new Intent(MainActivity.this, ActivityToStartName.class); activity_context.startActivity(i); }//you can make a if-else ladder or use switch-case 

现在回到你的OutsideClass,并开始新的活动做这样的事情 –

 @Override public void onClick(View v) { ........ case R.id.any_button: MainActivity mainAct = (MainActivity) real_context; mainAct.startNewActivity("ACTIVITY_KEY"); break; } ........ } 

这样你就可以开始从不同的OutsideClass调用不同的活动,而不会弄乱标志。

注意:尽量不要通过缓冲区的构造函数来caching上下文对象(使用适配器,很好)。一个片断应该有一个空的构造函数,否则在某些情况下应用程序会崩溃。

记得打电话

 OutsideClass.gettingContext(Context context); 

在onResume()函数中也是如此。

我也有同样的问题。 检查你已经通过的所有上下文。 对于“ 链接 ”,它需要活动上下文而不是应用上下文

这是你应该检查的地方:

1.)如果你使用了LayoutInflater,那么检查你已经传递的上下文。

2.)如果您正在使用任何适配器,请检查您通过的上下文。

 Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(viewIntent); 

我希望这会工作。

我有同样的问题。 问题在于上下文。 如果要打开任何链接(例如通过select器共享任何链接)传递活动上下文,而不是应用程序上下文。

不要忘了添加myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)如果你不在你的活动。

面对同样的问题,然后执行
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
并解决了这个问题。

可能还有另一个与列表视图适配器有关的原因。
你可以看到这个博客 ,描述得非常好。

使用这个代码。 对我来说工作得很好; 分享一些活动之外的东西

  Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // Append Text String Text = "Your Text Here" intent.putExtra(Intent.EXTRA_TEXT, Text); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent shareIntent = Intent.createChooser(intent,"Share . . . "); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); G.context.getApplicationContext().startActivity(shareIntent); 
 Intent i= new Intent(context, NextActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);