2016-07-05 19 views
2

私のサービスにはブロードキャストレシーバがあり、アクティビティからブロードキャストを送信してサービスを停止するなど、次のエラーが発生します。サービス内のAndroidブロードキャスト受信者はブロードキャストを送信するときにnullポインタ例外を指定します

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

は私がからブロードキャストを送信していた場所から活動です

私のサービスは継続的に実行されていると思われ、私がそれを伝えると停止する必要があります。これが私がフォアグラウンドサービスとして設定した理由です。ここで問題となるのは、ブロードキャストしようとするとエラーが発生することです。

答えて

6

brodcastreceiverを初期化する前に登録しています。そこで、以下のように初期化した後、登録を移動しよう:それはActivityを拡張していないので

また
/* 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は活動ではありません。

関連する問題