6

Sto tentando di associare un servizio, ma onBind() restituisce sempre false.OnBind() sul servizio restituisce sempre False - Android

Questo è il codice per la 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; 
    } 
}; 

questo è chiamata a bindService() -

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

Questa è la dichiarazione del servizio nel manifesto -

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

Ho letto domande precedenti riguardanti l'argomento e non sono riuscito a trovare ans wer (provato a cambiare il contesto di attività con il contesto dell'applicazione, ma non è stato di aiuto).

Sto usando utilizzando Frgaments e ActionBarSherlock e la mia attività si estende SlidingFragmentActivity (Ecco perché sto usando il contesto dell'applicazione, che non aiuta).

Edit - Questo è il codice del servizio che sto cercando di iniziare -

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(); 
    } 
} 

Qualsiasi aiuto sarà apprezzato. Grazie.

+0

Penso che dovresti rimuovere le .Notifiche nel Manifest. –

+0

Pubblica il codice di implementazione del servizio. – yorkw

+0

Ho modificato la domanda con l'implementazione. – Tofira

risposta

1

Qual è il nome di classe completo di ScheduleService (vale a dire incluso il nome del pacchetto completo)?

sto chiedendo questo, perché nel file AndroidManifest.xml, il nome del servizio è .Notifications.ScheduleService, che sembra un po 'strano:

Questo mi dice che o

  • L'(ultima parte il) nome-pacchetto contiene un maiuscolo carattere ... non così buono.
    Mi aspetterei invece .notifications.ScheduleService, se questo è il caso.
  • Il numero ScheduleService è definito all'interno di un file denominato Notifications.java. Mi aspetterei invece .Notifications$ScheduleService, se questo è il caso (segno di dollaro invece di punto).
1

Intendi dire bindService() restituisce falso? onBind() restituisce IBinder tipo.

Ricordare che l'associazione dei servizi richiede del tempo. Se si desidera eseguire un'azione dopo aver eseguito l'associazione, è possibile eseguirla nel metodo onServiceConnected().

public void onServiceConnected(ComponentName className, IBinder service) { 

    mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    Calendar c = new Calendar(); 
    mBoundService.setAlarm(c); 
} 

Se hai bisogno di più indicazioni su questo devi mostrarci il tuo codice attività.

0

Perché si utilizza il contesto dell'applicazione per associare il servizio? Il metodo bindService viene chiamato tramite ContextWrapper. Potrebbe non essere il problema, ma condivido i contesti in tutto il luogo in cui si associa il servizio e dove si ha la connessione.

Nel tuo caso invece di

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

farei il seguente

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

Oppure, se si vuole mantenere un contesto globale all'interno dell'applicazione, spostare tutto al file delle applicazioni e delle chiamate allo stesso modo, come suggerito sopra.

Il problema può riguardare anche il nome del pacchetto della tua app e la dichiarazione del tuo servizio nel tuo manifest. Se non sei sicuro, assicurati di dare il percorso globale al tuo servizio nel manifest.

Problemi correlati