web-dev-qa-db-fra.com

Exemple de service bind / unbind (Android)

pouvez-vous me donner un exemple simple d'application avec service d'arrière-plan qui utilise des méthodes bind/unbind pour le démarrer et l'arrêter? J'y cherchais pendant une demi-heure, mais ces exemples utilisent les méthodes startService/stopService ou sont très difficiles pour moi. Je vous remercie.

52
user1049280

Vous pouvez essayer d'utiliser ce code:

protected ServiceConnection mServerConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        Log.d(LOG_TAG, "onServiceConnected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(LOG_TAG, "onServiceDisconnected");
    }
}

public void start() {
    // mContext is defined upper in code, I think it is not necessary to explain what is it 
    mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
    mContext.startService(intent);
}

public void stop() {
    mContext.stopService(new Intent(mContext, ServiceRemote.class));
    mContext.unbindService(mServerConn);
}
60
Dawid Sajdak

Ajoutez ces méthodes à votre activité:

private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder binder) {
        myServiceBinder = ((MyService.MyBinder) binder).getService();
        Log.d("ServiceConnection","connected");
        showServiceData();
    }

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
};

public Handler myHandler = new Handler() {
    public void handleMessage(Message message) {
        Bundle data = message.getData();
    }
};

public void doBindService() {
    Intent intent = null;
    intent = new Intent(this, BTService.class);
    // Create a new Messenger for the communication back
    // From the Service to the Activity
    Messenger messenger = new Messenger(myHandler);
    intent.putExtra("MESSENGER", messenger);

    bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}

Et vous pouvez vous lier au service en survivant onResume (), et onPause () dans votre classe d'activité.

@Override
protected void onResume() {

    Log.d("activity", "onResume");
    if (myService == null) {
        doBindService();
    }
    super.onResume();
}

@Override
protected void onPause() {
    //FIXME put back

    Log.d("activity", "onPause");
    if (myService != null) {
        unbindService(myConnection);
        myService = null;
    }
    super.onPause();
}

Notez que lors de la liaison à un service, seule la méthode onCreate() est appelée dans la classe de service. Dans votre classe de service, vous devez définir la méthode myBinder:

private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;

@Override
public IBinder onBind(Intent arg0) {
    Bundle extras = arg0.getExtras();
    Log.d("service","onBind");
    // Get messager from the Activity
    if (extras != null) {
        Log.d("service","onBind with extra");
        outMessenger = (Messenger) extras.get("MESSENGER");
    }
    return mBinder;
}

public class MyBinder extends Binder {
    MyService getService() {
        return MyService.this;
    }
}

Après avoir défini ces méthodes, vous pouvez accéder aux méthodes de votre service dans votre activité:

private void showServiceData() {  
    myServiceBinder.myMethod();
}

et enfin, vous pouvez démarrer votre service lorsqu'un événement tel que _BOOT_COMPLETED_ survient

public class MyReciever  extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("Android.intent.action.BOOT_COMPLETED")) {
            Intent service = new Intent(context, myService.class);
            context.startService(service);
        }
    }
}

notez que lors du démarrage d'un service, onCreate() et onStartCommand() sont appelées dans la classe de service et vous pouvez arrêter votre service lorsqu'un autre événement se produit de stopService () notez que votre écouteur d'événement doit être enregistré dans votre fichier manifeste Android:

<receiver Android:name="MyReciever" Android:enabled="true" Android:exported="true">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>
41
HiB

Tout d’abord, deux choses que nous devons comprendre,

Client

  • Il fait une demande à un serveur spécifique

bindService(new Intent("com.Android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

ici mServiceConn est une instance de ServiceConnection class (intégrée), c’est en fait une interface que nous devons implémenter avec deux méthodes (la première pour le réseau connecté et le second réseau non connecté) pour surveiller l’état de la connexion réseau.

Serveur

  • Il gère la requête du client et crée sa propre réplique, qui est réservée au client qui envoie la requête. Cette réplique de serveur s'exécute sur un autre thread.

Maintenant, côté client, comment accéder à toutes les méthodes du serveur?

  • Le serveur envoie une réponse avec IBinder Object. Donc, IBinder object est notre gestionnaire qui accède à toutes les méthodes de Service à l'aide de l'opérateur (.).

.

MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        Log.d("ServiceConnection","connected");
        myService = binder;
    }
    //binder comes from server to communicate with method's of 

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
}

Maintenant, comment appeler la méthode qui se trouve dans le service

myservice.serviceMethod();

Ici myService est un objet et serviceMethod est une méthode dans le service. et de cette manière, la communication est établie entre le client et le serveur.

15
Hardik Gajera