2016-07-05 58 views
2

我在我的服务中有一个广播接收器,当我从我的活动向它发送广播以停止服务时,例如,我收到以下错误:Android BroadcastReceiver服务在向它发送广播时给出空指针异常

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.BroadcastReceiver.onReceive(android.content.Context, android.content.Intent)' on a null object reference 

这里是我服务类

public class PhraseService extends Service{ 

public static List<Phrase> phrases; 
private Context context; 

private static final String PHRASE_SERVICE_BROADCAST_ID = "com.cryogenos.safephrase.PHRASE_SERVICE_BROADCAST_ID"; 
private BroadcastReceiver command_broadcast_receiver; 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    this.context = getApplicationContext(); 
    LocalBroadcastManager.getInstance(this).registerReceiver(command_broadcast_receiver, new IntentFilter(PHRASE_SERVICE_BROADCAST_ID)); 

    Log.i("COS", "STARTED SELF"); 

    /* Handle any command sent by the app here */ 
    command_broadcast_receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i("COS", "CALLED?"); 
      try { 
       String command = intent.getStringExtra("command"); 

       /* Based on the command given, perform an action */ 
       switch (command) { 
        case "RESTART RECOGNIZER": 
         break; 
        case "STOP": 
         Toast.makeText(context, "Phrase Listener Stopped", Toast.LENGTH_SHORT).show(); 
         stopSelf(); 
         break; 
       } 
      } 
      catch (Exception e){} 
     } 
    }; 
    Intent notif_intent = new Intent(this, Home.class); 
    PendingIntent pi = PendingIntent.getActivity(this, 0, notif_intent, 0); 
    Notification notif = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle("Phrase Listener") 
      .setContentText("Listening for Phrases") 
      .setContentIntent(pi) 
      .build(); 

    startForeground(34994, notif); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onDestroy() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(command_broadcast_receiver); 
    super.onDestroy(); 
} 


@Override 
public IBinder onBind(Intent intent) {return null;} 
} 

这里是活动从那里我是从发送广播:

public class SettingsModel { 

private Context context; 
private static final String PHRASE_SERVICE_BROADCAST_ID = "com.cryogenos.safephrase.PHRASE_SERVICE_BROADCAST_ID"; 
private LocalBroadcastManager local_broadcast_manager; 

public SettingsModel(Context context) { 
    this.context = context; 
    local_broadcast_manager = LocalBroadcastManager.getInstance(context); 
} 

public void handleSwitch(SettingsSwitch settings_switch, boolean status){ 
    switch (settings_switch){ 
     case POWER: 
      if(status) { 
       Intent i = new Intent(context, PhraseService.class); 
       context.startService(i); 
      } 
      else{ 
       Intent i = new Intent(PHRASE_SERVICE_BROADCAST_ID); 
       i.putExtra("command", "STOP"); 
       local_broadcast_manager.sendBroadcast(i); 
      } 
      break; 
     case VIBRATE: 
      break; 
     case RING: 
      break; 
     case TIMER: 
      break; 
    } 
} 
} 

我的服务是假设要持续运行,只有当我告诉它时,它应该停止。这就是为什么我将它设置为前台服务。这里的问题是,当我试图播放它时,我总是收到错误。

回答

6

在初始化之前,您正在注册您的brodcastreceiver。因此,尝试初始化后移动登记如下:

/* Handle any command sent by the app here */ 
    command_broadcast_receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i("COS", "CALLED?"); 
      try { 
       String command = intent.getStringExtra("command"); 

       /* Based on the command given, perform an action */ 
       switch (command) { 
        case "RESTART RECOGNIZER": 
         break; 
        case "STOP": 
         Toast.makeText(context, "Phrase Listener Stopped", Toast.LENGTH_SHORT).show(); 
         stopSelf(); 
         break; 
       } 
      } 
      catch (Exception e){} 
     } 
    }; 
LocalBroadcastManager.getInstance(this).registerReceiver(command_broadcast_receiver, new IntentFilter(PHRASE_SERVICE_BROADCAST_ID)); 

此外,您SettingsModel并不是一个活动,因为它不会扩展Activity