6

Ich versuche, einen Dienst zu binden, aber onBind() gibt immer false zurück.OnBind() auf Service gibt immer False zurück - Android

Dies ist der Code für die ServiceConnection -

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with our service has been established, 
     // giving us the service object we can use to interact with our service. 
     mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mBoundService = null; 
    } 
}; 

Dies wird Aufruf bindService() -

<service android:name=".Notifications.ScheduleService" android:enabled="true"/> 

-

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Dies ist die Erklärung des Dienstes in dem Manifest ist Ich habe vorhergehende Fragen bezüglich des Themas gelesen und konnte keine ANS finden (Ich habe versucht, den Aktivitätskontext mit dem Anwendungskontext zu wechseln, aber es hat nicht geholfen).

Ich verwende Frgaments und ActionBarSherlock, und meine Aktivität erweitert SlidingFragmentActivity (Deshalb verwende ich den Anwendungskontext, der nicht hilft).

Bearbeiten - Dies ist der Code des Dienstes i zu starten bin versucht -

public class ScheduleService extends Service { 

    /** 
    * Class for clients to access 
    */ 
    public class ServiceBinder extends Binder { 
     public ScheduleService getService() { 
      return ScheduleService.this; 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("ScheduleService", "Received start id " + startId + ": " + intent); 

     // We want this service to continue running until it is explicitly stopped, so return sticky. 
     return START_STICKY; 
    } 

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

    // This is the object that receives interactions from clients. See 
    private final IBinder mBinder = new ServiceBinder(); 

    /** 
    * Show an alarm for a certain date when the alarm is called it will pop up a notification 
    */ 
    public void setAlarm(Calendar c) { 
     // This starts a new thread to set the alarm 
     // You want to push off your tasks onto a new thread to free up the UI to carry on responding 
     new AlarmTask(this, c).run(); 
    } 
} 

Jede Hilfe geschätzt wird. Vielen Dank.

+0

Ich denke, Sie sollten die. Notifications im Manifest entfernen. –

+0

Geben Sie Ihren Service-Implementierungscode ein. – yorkw

+0

Ich habe die Frage mit der Implementierung bearbeitet. – Tofira

Antwort

1

Wie lautet der vollständig qualifizierte Klassenname ScheduleService (d. H. Einschließlich des vollständigen Paketnamens)?

ich dies zu fragen, weil in AndroidManifest.xml Datei, den Namen Ihres Dienstes ist .Notifications.ScheduleService, die schon ein wenig merkwürdig erscheint:

Das sagt mir, dass entweder

  • Die (letzte Teil der) Paketname enthält eine Großbuchstaben Zeichen ... nicht so gut.
    würde ich stattdessen .notifications.ScheduleService erwarten, wenn dies der Fall ist.
  • Die ScheduleService ist in einer Datei namens Notifications.java definiert. Ich würde stattdessen .Notifications$ScheduleService erwarten, wenn dies der Fall ist (Dollarzeichen statt Periode).
1

Meinst du bindService() gibt false zurück? onBind() gibt IBinder zurück.

Beachten Sie, dass die Bindung von Diensten einige Zeit in Anspruch nimmt. Wenn Sie nach dem Binden eine Aktion ausführen möchten, können Sie dies in der Methode onServiceConnected() durchführen.

Wenn Sie mehr Anleitung dazu benötigen, müssen Sie uns Ihren Aktivitätscode zeigen.

0

Warum verwenden Sie den Anwendungskontext, um den Dienst zu binden? Die Methode bindService wird über den ContextWrapper aufgerufen. Es ist möglicherweise nicht das Problem, aber ich würde Kontexte überall dort teilen, wo Sie den Dienst binden und wo Sie die Verbindung haben.

In Ihrem Fall statt

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

ich tun würde, die folgend

boolean test = bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Oder wenn Sie innerhalb der Anwendung einen globalen Kontext zu halten, alles zu Ihrer Anwendung Datei und Aufruf bewegen es ist ähnlich wie oben vorgeschlagen.

Das Problem kann auch auf den Paketnamen Ihrer App und die Deklaration Ihres Dienstes in Ihrem Manifest zurückzuführen sein. Wenn Sie sich nicht sicher sind, geben Sie dem Manifest die globale Route zu Ihrem Dienst an.