问题
如上所述,我不知道为什么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;
}
}
}
答案 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 的服务的下一个实例上调用,而不是完全打电话。 使用此模式的服务应始终检查此案例并妥善处理。