繁体   English   中英

Android ::为什么要使用getBooleanExtra java.lang.NullPointerException

[英]Android :: why getBooleanExtra java.lang.NullPointerException

问题

正如主题所述,我不知道为什么要使用getBooleanExtra() java.lang.NullPointerException。

我了解有时意图可能不包含其他内容。

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

所以,这就是为什么我不明白的原因。 请指教。 谢谢!

服务等级中的一些代码

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

编辑,有人问我在哪里打电话给我的服务? 首先,从活动。 二,来自广播接收器

onCreate()中的活动

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

    }
}

我最近遇到这个问题。 问题在于,甚至服务也可能被系统杀死并重新启动,这就是为什么您拥有START_STICKY。 与启动服务并传递有效意图不同,系统重新启动服务时,意图为空。 我只是在尝试提取任何额外内容之前检查空意图。

这是官方android开发人员博客的链接。
http://android-developers.blogspot.com/2010/02/service-api-changes-starting-with.html

这是一段基本上说明了我上面所说的内容

START_STICKY 与以前的行为基本相同,在该行为中,服务保持“启动”状态,稍后将由系统重新启动。 与平台先前版本的唯一区别在于,如果由于平台进程被终止而重新启动平台,则将在服务的下一个实例中使用空Intent调用onStartCommand()而不是根本不调用它。 使用此模式的服务应始终检查这种情况并进行适当处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM