Android :: why getBooleanExtra java.lang.NullPointerException

时间:2014-08-08 02:49:33

标签: java android

问题

如上所述,我不知道为什么getBooleanExtra() java.lang.NullPointerException。

据我所知,有时意图可能不包含额外内容。

但是,从下面的代码可以看出,每个getBooleanExtra()都有一个默认值为false。

所以,这就是我不理解的原因。请指教。 THX!

我服务类的一些代码

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("onStartCommand()->","Intent Service.... " + intent);

        final boolean SLEEP_MODE_ON  = intent.getBooleanExtra("SLEEP_MODE_ON",false);
        final boolean SLEEP_MODE_OFF = intent.getBooleanExtra("SLEEP_MODE_OFF",false);

        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                connectIfNecessary();

                if (SLEEP_MODE_ON){
                    doSleepMode_on();
                } else if (SLEEP_MODE_OFF) {
                    doSleepMode_off();
                }

            }
        });
        thread.start();

        return START_STICKY;
    }

编辑有些问我在哪里拨打我的服务?首先,来自活动。第二,来自broadcastReceiver

onCreate()中的ACTIVITY

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Remove title bar
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    startService(new Intent(this,mqttPushService.class)); //Setup MQTT Service


}//END of onCreate()

广播接收器

public class SleepModeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent sleepModeIntent;
        int broadcastID = intent.getIntExtra("BROADCAST_ID",0);

        switch (broadcastID) {
            case DataManager.BROADCAST_ID_SLEEP_MODE_START :
                sleepModeIntent = new Intent(context, mqttPushService.class);
                sleepModeIntent.putExtra("SLEEP_MODE_ON",true);
                context.startService(sleepModeIntent);
                break;
            case DataManager.BROADCAST_ID_SLEEP_MODE_STOP :
                sleepModeIntent = new Intent(context, mqttPushService.class);
                sleepModeIntent.putExtra("SLEEP_MODE_OFF",true);
                context.startService(sleepModeIntent);
                break;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

我最近碰到了这个。问题是系统甚至可以杀死和重新启动服务,这就是为什么你有START_STICKY。与启动服务并传递有效意图时不同,当系统重新启动服务时,intent为null。我只是在尝试提取任何额外内容之前检查一个空的意图。

以下是官方Android开发者博客的链接 http://android-developers.blogspot.com/2010/02/service-api-changes-starting-with.html

这是基本上说出我上面所说的段落

START_STICKY 与之前的行为基本相同,其中服务处于“已启动”状态,稍后将由系统重新启动。与以前版本的平台的唯一区别在于,如果它因为其进程被终止而重新启动,则onStartCommand()将在具有null Intent 的服务的下一个实例上调用,而不是完全打电话。 使用此模式的服务应始终检查此案例并妥善处理。