从其他类获取上下文导致NPE

时间:2013-08-23 03:42:13

标签: android

我正在尝试使用以下代码在非活动类中调用新活动:

Intent usage = new Intent(UsageActivity.getContext(),UsageActivity.class);
usage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
UsageActivity.getContext().startActivity(usage);

我有一个具有以下代码的UsageActivity:

public static Context mContext;

在onCreate()

下面
mContext = getBaseContext();

我创建了一个这样的方法:

public static Context getContext() {
        return mContext;
    }

它抛出一个例外说:

  

08-23 12:51:39.439:E / AndroidRuntime(15059):致命异性:主要
      08-23 12:51:39.439:E / AndroidRuntime(15059):java.lang.NullPointerException
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.content.ComponentName。(ComponentName.java:75)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.content.Intent。(Intent.java:3301)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at ph.teligent.nce.more.MoreManager.loadShowUsageView(MoreManager.java:673)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at ph.teligent.nce.more.MoreView.onItemClick(MoreView.java:125)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.widget.AdapterView.performItemClick(AdapterView.java:298)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.widget.AbsListView.performItemClick(AbsListView.java:1086)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:2859)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.widget.AbsListView $ 1.run(AbsListView.java:3533)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.os.Handler.handleCallback(Handler.java:615)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.os.Handler.dispatchMessage(Handler.java:92)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.os.Looper.loop(Looper.java:137)
      08-23 12:51:39.439:E / AndroidRuntime(15059):在android.app.ActivityThread.main(ActivityThread.java:4745)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at java.lang.reflect.Method.invokeNative(Native Method)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at java.lang.reflect.Method.invoke(Method.java:511)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
      08-23 12:51:39.439:E / AndroidRuntime(15059):at dalvik.system.NativeStart.main(Native Method)

我创建上下文的方式是错误的吗? 任何thoghts将受到高度赞赏。

5 个答案:

答案 0 :(得分:1)

使用以下代码

Intent i = new Intent(UsageActivity.getContext(),YourActivity.class);
            UsageActivity.getContext().startActivity(i);

mContext是您的活动背景

还可以使用下面的onCreate()从

更新主活动中的代码
mContext = getBaseContext();

to 
mContext = UsageActivity.this;

答案 1 :(得分:0)

您不能“使用此代码在非活动类中调用新活动”!

您必须在CURRENT上下文中调用startActivity()。您可以将当前上下文作为类字段转换为非活动类。

答案 2 :(得分:0)

它看起来在这里

Intent usage = new Intent(UsageActivity.getContext(),UsageActivity.class);

就像你对两个参数使用相同的活动一样......你能在它的构造函数中将上下文传递给这个活动吗?

答案 3 :(得分:0)

  

我创建上下文的方式是错误的吗?

是的,您使用的是尚未存在的上下文,使BaseContext不是一个干净的方式

 Intent usage = new Intent(UsageActivity.getContext(),UsageActivity.class);

所以你应该将第一个调用你的非活动类的Activity上下文传递给你的非活动类,然后使用该上下文来启动第二个活动。

 Intent usage = new Intent(context,UsageActivity.class);

答案 4 :(得分:0)

你没有走错路,但你得到了getBaseContext()null。只需编辑一行即可。

在活动的onCreate()方法中写下此行。

mContext = this;