plusone

31. Oktober 2011

Android Service - bindService und Methodenaufruf (Part2)

Guten Abend,

ich habe euch bereits in Part 1 gezeigt, wie ihr mit einem Android Service umgehen könnt. Aber einen Service im Hintergrund starten und seine Arbeitet verrichten zu lassen, ist uns jetzt nicht genug. Dafür könnten wir auch Threads benutzen.
Heute beschäftigen wir uns anbinden von einem Service, der uns dann zur Verfügung steht und auch dann die Arbeit verrichtet, die wir auch zu dem Zeitpunkt auch brauchen.



So fangen wir mit der Service-Klasse an. Dieses Mal hat Klasse mehr Inhalt:
import android.app.Service;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class StorageService extends Service {

    // Binder wird von der ServiceConnection verwendet
    private final IBinder mBinder = new LocalBinder();

    /**
     * Usere verschachtelte Klasse
     */
    class LocalBinder extends Binder {
  
        /**
         * Damit erhalten wir Zugriff auf unseren Service.
         * Gibt unsere Instanz des StorageService zurück.
         */
        StorageService getService() {
            return StorageService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
            Log.i("INFO", String.format(
                    "binding service %s", getClass()
                            .getSimpleName()));
        return mBinder;
    }

    public String getMyWork() {
        //do smth...
        return "Ergibnis";
    }
}
Damit ist unser Service soweit erweitert, dass wir später auf ihn zugreifen können. Die Methode getMyWork() ist für den Zugriff gedacht, hier könnt ihr eure Sachen euren Code implementieren. Genau könnt ihr auch eure eigene Methoden entwerfen - hier gilt normale Javaprogrammierung.

So kommen wir dazu, wie wir das nun insere zB Activity einbinden können:
import android.content.Intent;
import android.content.Context;

import android.content.ServiceConnection;
import de.alexroid.service.StorageService;

//Instanzvariable
private ServiceConnection mConnection;

// anbinden unseres Service
// onResume()-Methode ist dafür recht gut geeignet
mConnection = new de.alexroid.service.ServiceConnection();
Intent service = new Intent(this, StorageService.class);
bindService(service, mConnection, Context.BIND_AUTO_CREATE);

// wieder freilassen nicht vergessen
// onPause()-Methode ist angebracht
unbindService(mConnection);
Diesen Quellcode könnt nutzen, aber vergesst nicht, wenn ihr einen Service anbindet, müsst ihr ihn später wieder loslassen, sonst gibts leaks:
Activity de.alexroid.test.Test has leaked ServiceConnection de.alexroid.test.Test$2@461d7730 that was originally bound here
android.app.ServiceConnectionLeaked: Activity de.alexroid.test.Test has leaked ServiceConnection de.alexroid.test.Test$2@461d7730 that was originally bound here

Wie ihr schon gesehen habt, ist nun ein ServiceConnection mit von der Partie. Damit könnt ihr den Service wieder frei geben.

import android.content.ComponentName;
import android.os.IBinder;
import de.alexroid.service.StorageService.LocalBinder;
import de.alexroid.global.Globals;

public class ServiceConnection implements android.content.ServiceConnection {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Globals.service = ((LocalBinder) service).getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Globals.service.unbindService(this);
    }
}

Diese Klasse erlaubt euch den Zugriff auf euren Service. Beim onServiceConnected(..)  kriegt ihr euren IBinder und damit auch die Methode getService().
Ich habe meine Service-Instanz in eine Globals-Klasse als statische Variable ausgelagert. Das ist eine Möglichkeit immer auf den Service zuzugreifen zu können.

Also kurz und knap, ihr brauch eine Klasse, die von Service ableitet. Eine weitere Klasse, die von ServiceConnection ableitet, wird auch benötigt. Den rest könnt ihr in eure Activity machen, sprich bindService und unbindService.
Die Meisterleistung ist vollbracht - easy doing.

Damit noch viel Erfolg und ein Happy Halloween.
Alexander Fink

Part 1 - Einstieg in Service

QUELLE:
http://developer.android.com/guide/topics/fundamentals/bound-services.html

2 Kommentare:

Michael hat gesagt…

und wie rufe ich getMyWork auf?

Hilfesuchender hat gesagt…

kann ich auch von einer normalen Klasse (keiner Activity aus) den Service aufrufen? und wenn ja wie?

Kommentar veröffentlichen