2017-04-23 3 views
0

Mein Service:Service hört nicht auf bestimmte Sendungen

@Override 
    public void onCreate() { 
     if (debug_mode) {Log.i(TAG,"onCreate");} 
     super.onCreate(); 
     // set receivers 
     m_filter.addAction("PREPARE_AUDIO"); 
     m_receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       if (debug_mode) {Log.i(TAG,"broadcast received: " + intent.getAction());} 
       if (intent.getAction().equals("PREPARE_AUDIO")) { 
        set_up_audio(); 
       } 
      } 
     }; 
     registerReceiver(m_receiver, m_filter); 
    } 

und meine Aktivität:

@Override 
protected void onStart() { 
     super.onCreate(savedInstanceState); 
     if (debug_mode) Log.i(TAG, "onCreate"); 
     setContentView(R.layout.activity_guide); 
     // start service 
     startService(new Intent(this, PlayerService.class)); 
} 
@Override 
protected void onStart() { 
     if (debug_mode) {Log.i(TAG,"onStart");} 
     super.onStart(); 
     // prepare audio 
     Intent intent = new Intent(); 
     intent.setAction("PREPARE_AUDIO"); 
     sendBroadcast(intent); 
} 

Dies wird die BroadcastReceiver in meinem Dienst nicht auslösen. Es wird auch nicht ausgelöst, wenn ich den Code auf onCreate oder onResume setze. Es wird es jedoch auslösen, wenn z. auf einigen Listener verbunden mit einem Button, oder in der onStop Rückruf der Aktivität. Warum das?

+0

Vermutlich läuft Ihr Dienst noch nicht, wenn "onCreate()", "onStart()" oder "onResume()" aufgerufen werden. – CommonsWare

+0

und wie kann ich sicherstellen, dass es läuft? Ich habe meine Antwort mit dem Code bearbeitet, der den Dienst startet –

+0

Die einfachere Lösung ist es, nicht zu versuchen, die Sendung so bald zu senden. Du solltest das nicht tun müssen. Wenn Sie den Dienst benötigen, um etwas sofort zu tun, tun Sie dies in 'onStartCommand()'. – CommonsWare

Antwort

1

Anstatt zu versuchen, eine Sendung sofort zu senden, lassen Sie den Dienst seine Einrichtung in seiner onCreate() oder onStartCommand() Methode tun.

Beachten Sie, dass das Verwenden von System-Broadcasts eine ziemlich schlechte Idee ist, es sei denn, Ihr Dienst befindet sich in einem separaten Prozess von Ihrer Benutzeroberfläche. Selbst dann müssen Sie die Sicherheit durchdenken, da jede App Ihrem Dienst mitteilen kann, was zu tun ist, indem Sie Broadcasts senden.

Wenn Ihr Dienst und Ihre Benutzeroberfläche im selben Prozess ausgeführt werden, verwenden Sie einen prozessinternen Ereignisbus (z. B. LocalBroadcastManager, greenrobots EventBus), nicht nur für verbesserte Sicherheit, sondern auch für bessere Leistung.