2010-08-03 5 views
0

J'ai un composant de service (tâche commune à toutes mes applications), qui peut être appelé par l'une des applications. J'essaie d'accéder à l'objet de service de toutes les activités, j'ai remarqué que celui qui a créé le service [startService (intention)] a la bonne informaion. Mais le repos n'obtient pas l'informaion nécessaire. Mon code est le suivant:Plusieurs activités liées à un service

// Activity.java 
public void onCreate(Bundle savedInstanceState) { 
    ... 

    Intent intent = new Intent (this.context, Service.class) ; 
    this.context.startService(intent) ; 
    this.context.bindService(intent, this, Context.BIND_AUTO_CREATE) ; 
    ... 
    String result = serviceObj.getData() ; 
} 

public void onServiceConnected(ComponentName name, IBinder service) { 
    serviceObj = ((Service.LocalBinder)service).getService(); 
    timer.scheduleAtFixedRate(task, 5000, 60000) ; 
} 



// Service.java 

private final IBinder mBinder = new LocalBinder(); 

public class LocalBinder extends Binder { 
    Service getService() { 
     return Service.this; 
    } 
} 

public void onCreate() { 
    super.onCreate(); 
    context = getApplicationContext() ; 
} 

public void onStart(Intent intent, int startId) { 

... some processing is done here... 

} 

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

Si j'appelle startService (intention). il crée un nouveau service et fonctionne en parallèle avec l'autre service.

Si je n'invoque pas startService (intention), serviceObj.getData() rétablit la valeur null. Est-ce que quelqu'un peut m'éclairer où est-ce que je me suis trompé?

Tout type de pointeur sera très utile ..

Merci et salutations, Vinay

Répondre

7

Si j'invoque startService (intention). il crée un nouveau service et fonctionne en parallèle avec l'autre service.

Non, ce n'est pas le cas. Il y aura au plus une instance de votre service en cours d'exécution.

Si je n'invoque pas startService (intention), serviceObj.getData() rétablit la valeur null.

startService() n'a rien à voir avec cela, d'après ma lecture de votre code. Vous essayez d'utiliser serviceObj dans onCreate(). Cela ne marchera jamais. bindService() est un appel asynchrone. Vous ne pouvez pas utiliser serviveObj jusqu'à ce que onServiceConnected() soit appelée. onServiceConnected() ne sera pas appelé jusqu'à ce que onCreate() retourne.

aussi:

  • Bien qu'il y ait des cas où vous pourriez avoir besoin à la fois startService() et bindService(), ils ne sont pas à la fois nécessaire dans le cas normal.
  • N'utilisez pas getApplicationContext().
+0

Merci pour la réponse. Ça m'a aidé. En ce qui concerne le service fonctionnant en parallèle à l'autre, j'ai trouvé que cela était dû à "new Intent (this.context, Service.class)". J'ai remplacé cela par "new Intent (" com.package "," com.package.service ");" Merci pour les pointeurs .. – Vinay

+0

Vous dites "Ne pas utiliser getApplicationContext". Donc, cela s'appliquerait-il à la réponse acceptée de http://stackoverflow.com/questions/3141632/android-service-interacting-with-multiple-activities également? Je la réponse "faux"/contre les règles là-bas? – OneWorld

+0

@OneWorld: Je ne suis définitivement pas un fan du «stick an' Activity' dans le 'Application' pour suivre le modèle de« l'activité actuelle ». Si rien d'autre, un membre de données statiques fonctionne aussi bien et avec une plus grande flexibilité. Au-delà de cela, empêcher une «Activité» d'être ramassée par les ordures est une prescription pour les problèmes. – CommonsWare

Questions connexes