【问题标题】:AndroidRuntimeException "Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag"AndroidRuntimeException “从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志”
【发布时间】:2012-12-20 18:23:09
【问题描述】:

我在列表视图中创建了多个布局,但是当我单击时,我得到一个 AndroidRuntimeException “从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?”

我正在添加

Intent.FLAG_ACTIVITY_NEW_TASK

我的意图,但我得到了同样的信息! =(

      @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                    retval=LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_anuncio, null);
                    ImageView image=(ImageView) retval.findViewById(R.id.imageAD);
                    LoadAds loadAds= new CargaAnuncios();
                    clickUrl = LoadAds.cargaImagenAnuncio(image, mContext, GlobalInfo.ANUNCIO_CARRIL_PORTADA);
                    image.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View view) {
                            Bundle bundle=new Bundle();
                            bundle.putString("url", clickUrl);
                            Intent intent =new Intent(mContext,CustomWebView.class);
                            intent.putExtras(bundle);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            mContext.startActivity(intent);
                        }

                    });
            return retval;
        }

【问题讨论】:

  • 你从哪里得到 mContext?它是 Activity 上下文还是应用程序或服务上下文?

标签: android runtime-error


【解决方案1】:

getApplicationContext() 替换为this。最有可能的是,您应该在代码中的任何地方都使用 getApplicationContext() —— 仅当您特别需要 Application 对象时才使用 getApplicationContext()

【讨论】:

  • 嗨墨菲先生,我用“this”试过了,但我得到了同样的例外=(
  • @Jorgesys:另外,去掉所有出现的mContext。其中mContext 是参数, use this` 或NameOfYourActivityClass.this
【解决方案2】:

旧线程,但认为这个简单的解决方案可能会对某人有所帮助。与其传递上下文,不如从视图中获取它。例如:view.getContext()

@Override
public void onClick(View view) {
    Bundle bundle=new Bundle();
    bundle.putString("url", clickUrl);
    Intent intent =new Intent(view.getContext(),CustomWebView.class);
    intent.putExtras(bundle);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    view.getContext().startActivity(intent);
}

【讨论】:

    【解决方案3】:

    我已添加:

    parent.getApplicationContext()

    不仅仅是:

    getApplicationContext()

    整行是:

    retval=LayoutInflater.from(parent.getApplicationContext()).inflate(R.layout.layout_anuncio, null);
    

    【讨论】:

      【解决方案4】:

      Warren Lankie Van Tonder 的解决方案几乎是好的:

      -您应该避免使用 Activity 上下文并选择 Application Context,以防止内存泄漏。 Android 开发者的这篇博客解释说http://android-developers.blogspot.be/2009/01/avoiding-memory-leaks.html

      -但是在 Activity 上下文的情况下,您的代码是唯一的解决方案(可能用于从活动外部调用另一个活动)并且关于上面的链接,您必须在每个 onPause() 中使用 释放静态引用p>

      AppGlobals.setAppContext(null);

      作为回报,在 onResume 而不是 onCreate 中设置静态字段。

      【讨论】:

        【解决方案5】:

        感谢 CommonsWare,我想出了这个效果最好的解决方案。

        我添加了一个新课程

        package com.test.test;
        
        import android.app.Activity;
        import android.content.Context;
        import android.content.Intent;
        import android.os.Bundle;
        
        public class AppGlobals extends Activity {
            private static Context appContext;
        
            public static Context getAppContext(){
                return appContext;
            }
        
            public static void setAppContext(Context context){
                appContext = context;
            }
        
            public static void StartActivity(Intent intent){
                appContext.startActivity(intent);
            }
        }
        

        然后我需要做的就是在我导航到的每个活动 onCreate 上添加以下代码。

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            AppGlobals.setAppContext(this);
        }
        

        这允许新意图启动,就好像它与正常的应用程序流一起工作一样,这样我就不必为意图设置标志。

        调用 start Activity 方法很简单:

        Intent totalTimerIntent = new Intent(AppGlobals.getAppContext(), TotalTimer.class);
        AppGlobals.StartActivity(totalTimerIntent);
        

        希望这对我有所帮助。

        谢谢 CommonsWare。

        【讨论】:

          【解决方案6】:
          CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);
          

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

          改为下面

          CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
          

          【讨论】:

            猜你喜欢
            • 2018-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-17
            • 2020-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多