web-dev-qa-db-fra.com

Comment appeler des méthodes d'un service d'activité?

Je veux simplement appeler des méthodes d'un service local de mon activité. Comment puis je faire ça ?

25
Shiz

Une façon de procéder consiste à définir une interface avec AIDL d'Android et à utiliser le sous-système Binder pour exécuter l'IPC. Le lien que j'ai posté contient de nombreuses instructions. Je commencerais par là et posterais ici si vous avez des questions. Bien qu’il s’agisse d’un sujet assez complexe (IPC), Android et la Binder font un très bon travail en le rendant assez simple (au moins pour commencer, je suis sûr que vous pourriez le compliquer si vous le vouliez ;-))

Edit Comme indiqué dans les commentaires, cela n'est pas nécessaire si Service et le client s'exécutent dans le même processus. Sauf indication contraire de votre part, il s'agit de la valeur par défaut. Cependant, cela fonctionne quand même, cela ajoute juste un peu plus de complexité.

2
Chris Thompson

Voici un exemple qui pourrait aider
Server.Java:

package com.example.bindservice.binder;

import Java.text.SimpleDateFormat;
import Java.util.Date;

import Android.app.Service;
import Android.content.Intent;
import Android.os.Binder;
import Android.os.IBinder;

public class Server extends Service {

    IBinder mBinder = new LocalBinder();

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

    public class LocalBinder extends Binder {
        public Server getServerInstance() {
            return Server.this;
        }
    }

    public String getTime() {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return mDateFormat.format(new Date());
    }
}

Client.Java  

package com.example.bindservice.binder;

import Android.app.Activity;
import Android.content.ComponentName;
import Android.content.Intent;
import Android.content.ServiceConnection;
import Android.os.Bundle;
import Android.os.IBinder;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;
import Android.widget.Toast;

import com.example.bindservice.binder.Server.LocalBinder;

public class Client extends Activity {

    boolean mBounded;
    Server mServer;
    TextView text;
    Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView)findViewById(R.id.text);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                text.setText(mServer.getTime());
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        Intent mIntent = new Intent(this, Server.class);
        bindService(mIntent, mConnection, BIND_AUTO_CREATE);
    };

    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(Client.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mServer = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(Client.this, "Service is connected", 1000).show();
            mBounded = true;
            LocalBinder mLocalBinder = (LocalBinder)service;
            mServer = mLocalBinder.getServerInstance();
        }
    };

    @Override
    protected void onStop() {
        super.onStop();
        if(mBounded) {
            unbindService(mConnection);
            mBounded = false;
        }
    };
}
50
Prateek Yadav

Il existe un exemple de code pour ce droit dans la documentation du service, sous "Exemple de service local":

http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Pour les personnes qui suggèrent aidl - si votre service et votre client font tous partie de votre propre .apk et s'exécutant dans le même processus (le comportement par défaut), il n'y a aucun besoin de helpl; c'est simplement une complexité supplémentaire qui ne vous donne rien.

28
hackbod

Je ne sais pas où se trouve votre problème, merci de poster du code . À l'aide d'un classeur, l'activité peut avoir accès à l'objet de service. Voir les exemples dans l'API pour créer une connexion entre activité et service. 

Ayant l'objet de service dans votre activité, vous pouvez simplement appeler:
mService.votreMéthode ();
Nous pourrions vous aider beaucoup mieux si vous décriviez exactement votre problème et, comme je l'ai dit, publiez des extraits. 

0
Jonathan Roth