web-dev-qa-db-fra.com

Android: passer le paramètre au service à partir de l'activité

Je lie au Service de cette façon:

Classe d'activité:

ListenLocationService mService;
@Override
public void onCreate(Bundle savedInstanceState) {
        ...
        Intent intent = new Intent(this, ListenLocationService.class);
        intent.putExtra("From", "Main");
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        ...
}

private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,
                IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();         
        }

        public void onServiceDisconnected(ComponentName arg0) {
        }
    };

Il s'agit de la méthode onBind de mon Service:

@Override
public IBinder onBind(Intent intent) {
    Bundle extras = intent.getExtras(); 
    if(extras == null)
        Log.d("Service","null");
    else
    {
        Log.d("Service","not null");
        String from = (String) extras.get("From");
        if(from.equalsIgnoreCase("Main"))
            StartListenLocation();
    }
    return mBinder;
}

J'ai donc "null" dans LogCat - le bundle est null malgré que j'ai fait intent.putExtra Avant bindService

En général, le service fonctionne bien. Cependant, je dois appeler StartListenLocation(); uniquement depuis l'activité principale de l'application (je décide de le faire en envoyant un drapeau).

Comment envoyer des données au service ou peut-être existe-t-il une autre façon de vérifier quelle activité a lancé onBind?

20
Ilya Blokh

1 Créez une interface qui déclare toutes les signatures de méthode que vous souhaitez appeler à partir d'une activité:

public interface ILocationService {
  public void StartListenLocation(Location location);
}

2 Faites en sorte que votre classeur implémente ILocaionService et définissez le corps de la méthode réelle:

public class MyBinder extends Binder implements ILocationService {
  ... ...

  public void StartListenLocation(Location location) {
    // implement your method properly
  }

  ... ...
}

3 Dans l'activité qui se lie au service, référencez votre classeur par l'interface:

... ...

ILocationService mService; // communication is handled via Binder not the actual service class.

private ServiceConnection mConnection = new ServiceConnection() {

  public void onServiceConnected(ComponentName className, IBinder service) {
    mService = (ILocationService) service;     
  }

  ... ...
};

... ...

// At some point if you need call service method with parameter:
Location location = new Location();
mService.StartListenLocation(location);

Toutes les communications (c'est-à-dire l'appel de méthode à votre service) doivent être traitées et effectuées via l'initialisation et le retour de la classe binder dans ServiceConnection.onServiceConnected (), et non la classe de service réelle (binder.getService () n'est pas nécessaire). Voici comment lier la communication de service conçue pour fonctionner dans l'API.

Notez que bindService () est un appel asynchrone. Il y aura un décalage après que vous appelez bindService () et avant que le rappel ServiceConnection.onServiceConnected () ne soit impliqué par le système. Par conséquent, le meilleur endroit pour effectuer la méthode de service est immédiatement après que mService a été initialisé dans la méthode ServiceConnection.onServiceConnected ().

J'espère que cela t'aides.

9
yorkw

Vous pouvez passer le paramètre de cette manière simple: -

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
   serviceIntent.putExtra("From", "Main");
   startService(serviceIntent);

et obtenez le paramètre dans la méthode onStart de votre classe de service

    @Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
     Bundle extras = intent.getExtras(); 
if(extras == null)
    Log.d("Service","null");
else
{
    Log.d("Service","not null");
    String from = (String) extras.get("From");
    if(from.equalsIgnoreCase("Main"))
        StartListenLocation();
}

}

Prendre plaisir :)

32
Deepak Sharma

Selon cette session http://www.google.com/events/io/2010/sessions/developing-RESTful-Android-apps.html

Une façon d'envoyer des données à un service consiste à utiliser une base de données contenant des colonnes pid (identifiant de processus), des données, un statut où le statut peut être LIRE, PRÊT, LIAISON, etc., lorsque le service est chargé, il lit la table qui est rempli par l'activité d'appel et peut être supprimé une fois terminé, l'autre moyen indiqué est AIDL comme indiqué dans la réponse précédente, choisissez selon votre application.

0
user1304907