Android运行时异常“在Activity上下文之外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志”。

5

我在一个列表视图中创建了多个布局,但是当我点击时,会出现AndroidRuntimeException "Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?"的错误。

我已经在我的意图中添加了

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;
        }

1
你从哪里获取mContext?它是Activity上下文还是应用程序或服务上下文? - iagreen
6个回答

19

this 替换 getApplicationContext()。很可能,在代码的所有部分都应该这样做,只有在需要使用 Application 对象时才使用 getApplicationContext()


嗨,Murphy先生,我尝试了“this”,但是我仍然得到相同的异常=( - Jorgesys
1
@Jorgesys:此外,删除所有mContext的出现。在mContext是参数的情况下,请使用thisNameOfYourActivityClass.this - CommonsWare

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

0

我已经添加了:

parent.getApplicationContext()

不要只写:

getApplicationContext()

完整的代码行应该是:

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

0

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

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

-但是,在Activity上下文是您代码的唯一解决方案的情况下(也许是从活动外部调用另一个活动),并且考虑到上面的链接,您必须在每个onPause()中释放静态引用。

AppGlobals.setAppContext(null);

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

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

这样新的意图就可以像正常应用程序流程一样启动,这样我就不必为意图设置标志。

调用start activity方法就像这样简单:

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

希望这可以像它对我一样帮助到别人。

谢谢CommonsWare。


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

或者

Context mContext = getAppliactionContext();

CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

改为以下内容

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接