Android - 声明变量后的Null Intent

时间:2013-11-19 16:39:22

标签: android android-intent nullpointerexception notifications android-pendingintent


我有两节课。第一个包含以下代码:

Intent app=new Intent(context, NotificationButtonsHandler.class);
app.putExtra("DO", "app");
PendingIntent pApp = PendingIntent.getActivity(context, 0, app, 0);
view.setOnClickPendingIntent(R.id.app, pApp);

另一个包含以下代码:

String action = (String) getIntent().getExtras().get("DO");
if (action.equals("app")) {
    Intent app = new Intent(this, Resolution.class);
    startActivity(app);
}

通过使用我实现的第一个Intents来启动第二个活动。
由于可读性的原因,我决定修改第一类的来源如下:

public static final String ACTION_NAME = "DO";
public static final String ACTION = "App";    
Intent app=new Intent(context, NotificationButtonsHandler.class);
app.putExtra(ACTION_NAME, ACTION);
PendingIntent pApp = PendingIntent.getActivity(context, 0, app, 0);
view.setOnClickPendingIntent(R.id.app, pApp);

第二个修改如下:

String action = (String) getIntent().getExtras().get(ClassA.ACTION_NAME);
//Even if I put here Log.e("ERROR", action); the compiler complains for NullPointerException
if (action.equals(ClassA.ACTION)) { //NullPointerException
    Intent app = new Intent(this, Resolution.class);
    startActivity(app);
}

这些修改的结果是在第二类指定的点处出现NullPointerException。
任何想法为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

您不需要使用putExtra传递静态变量,所以

app.putExtra(ACTION_NAME, ACTION);

String action = (String) getIntent().getExtras().get(ClassA.ACTION_NAME);

两者都可以删除,只需使用ClassA.ACTION_NAME和ClassA.ACTION直接访问静态变量

我相信真正的问题在这里

变化

String action = (String) getIntent().getExtras().get(ClassA.ACTION_NAME);

String action = (String) getIntent().getExtras().get(ACTION_NAME);

答案 1 :(得分:0)

问题在于您生成PendingIntent的方式。你写过:

PendingIntent pApp = PendingIntent.getActivity(context, 0, app, 0);

如果系统中已有PendingIntent具有相同的组件(例如:NotificationButtonsHandler),则此调用将返回现有的PendingIntent,其中可能包含也可能不包含你想要的额外的东西。要解决此问题,您应该像这样创建PendingIntent

PendingIntent pApp = PendingIntent.getActivity(context, 0, app, PendingIntent.FLAG_UPDATE_CURRENT);

这将确保检索PendingIntent的调用实际上将替换您提供的额外内容。