2016-07-22 7 views
0

In meinem MainActivity verwende ichKommunikation zwischen Service und eine Klasse

Intent serviceIntent = new Intent(this, myService.class); 
bindService(serviceIntent,serviceConn, Context.BIND_AUTO_CREATE); 

einen blutetooth Verbindungsdienst zu erstellen, wenn is.connect() gibt true zurück, ich ohne Verwendung eines Broadcaster eine Variable aus dem Dienst zu einer separaten Klasse übergeben werden soll. Wenn ich CheckIfConnected() Int Service erstelle, wie rufe ich es aus einer separaten Klasse?

Danke

Antwort

1

Der einfachste Weg, nahtlos zu kommunizieren und ohne fest Anwendungscode zu koppeln, versuchen events verwenden. Mein Favorit ist EventBus - android library. Hier ist, wie Sie können dies tun:

Fügen Sie diese auf Ihre build.gradle Datei (Modulebene)

compile 'org.greenrobot:eventbus:3.0.0' 

Als nächstes erstellen Plain Old Java Object (POJO) Ihre Veranstaltung zu vertreten!

public class ServiceConnectedEvent{ 
    private boolean isServiceConnected; 

    ServiceConnectedEvent(boolean isConnected){ 
     this.isServiceConnected = isConnected; 
    } 

    public boolean isServiceConnected{ 
     return this.isServiceConnected; 
    } 
} 

nächstes in Ihrem Dienst, der als publisher, schreiben Sie eine Veranstaltung wie diese handeln:

EventBus.getDefault().post(new ServiceConnectedEvent(true)); 

Jetzt, in der Klasse, die Sie von Dienstverbindungsstatus informieren möchten, können Sie registrieren sie es ein subscriber wie diese zu machen:

EventBus.getDefault().register(this); 

tatsächlich um die Benachrichtigung in Ihrer Klasse zu erhalten, fügen sie diese Methode:

public void onEvent(ServiceConnectedEvent event){ 
    if(event.isServiceConnected()){ 
     //do what you need when service is connected 
    } 
} 

Denken Sie daran, dass Sie alles zurückgeben können, was Sie wollen, wie eine Variable Ihrer Wahl!

Wenn Sie in einer Aktivität oder ein Fragment sind, können Sie das Ereignis innerhalb onDestroyunregister:

@Override 
public void onDestroy(){ 
    super.onDestroy(); 

    EventBus.getDefault().unregister(this); 
} 

Dies sollte Ihre Kommunikation zwischen Ihrem Service und jede andere Klasse einfach machen !!

Ich hoffe, dass es funktioniert - viel Glück und gute Programmierung!

0

Vielleicht könnten Sie eine Rückrufmethode verwenden. Sie könnten Ihre eigene Intent-Klasse erstellen, die sie erweitert, aber über eine Schnittstelle verfügt, die die Methode enthält, die Sie aufrufen möchten. Dann könnten Sie die Methode connect() überschreiben, die dann diese Schnittstellenmethode aufrufen würde, bevor sie true zurückgibt. Dann müssten Sie Ihre separate Klasse Ihre CustomIntent.ConnectInterface implementieren und es Ihre Schnittstellenmethode überschreiben. Ich denke, dass würde wahrscheinlich funktionieren, wenn ich Ihr Problem richtig verstehe.

public class CustomIntent extends Intent { 
    public interface ConnectInterface { 
     public void connectInterfaceCallback(); 
    } 
    private ConnectInterface callback; 
    public CustomIntent(ConnectInterface callback){ 
     super(); 
     this.callback = callback; 
    } 
    @Override 
    public boolean connect() { 
     if(super.connect()){ 
     callback.connectInterfaceCallback(); 
     return true; 
     } else { 
     return false; 
     } 
    } 
} 

Und dann:

public class SeparateClass implements CustomIntent.ConnectInterface { 
    ... 
    @Override 
    public void connectInterfaceCallback() { 
     ... 
    } 
} 
+0

Bearbeitete es mit einem kleinen Beispiel, das illustriert, was ich sagen wollte. – h3X3n