AndroidRuntimeException“从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志”

时间:2012-12-20 18:23:10

标签: android runtime-error

我在listview中创建了多个布局,但是当我点击i得到一个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;
        }

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:1)

旧线程,但认为这个简单的解决方案可能会帮助某人。而不是传递上下文,只需从视图中获取它。例如:- You live since 25 years and 280 days

view.getContext()

答案 2 :(得分:0)

我已添加:

  

parent.getApplicationContext()

而不仅仅是:

  

getApplicationContext()

整行是:

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

答案 3 :(得分:0)

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

Context mContext = getAppliactionContext();

CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

更改为

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);

答案 4 :(得分:0)

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

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

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

  

AppGlobals.setAppContext(空);

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

答案 5 :(得分:-1)

感谢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);
}

这允许新意图开始,好像它使用正常的应用程序流一样,这样我就不必为意图设置Flag。

调用start活动方法非常简单:

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

希望这可以帮助我,因为它帮助了我。

谢谢CommonsWare。