2016-06-22 13 views
1

Ich habe einen Dienst in Android, der ein Framework einkapselt, das über eine start-Methode verfügt. Der Service läuft darauf hinaus, so etwas wie diese, viele Dinge weggelassen:Binden und Starten eines Dienstes beim Starten der Anwendung

public class MyService extends Service { 

    private IBinder thisBinder; 

    public MyService(){ 
     thisBinder = new LocalBinder(); 
    } 

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

    public void start(Map<String, Object> options) 
    { 
     getDriverManager().start(options); 
    } 
} 

ich auch eine Brücke Klasse, die Anrufe zum Service macht:

public class MyServiceBridge implements ServiceConnection { 

    private boolean started = false; 
    private boolean bound = false; 
    private MyService myService; 

    public MyServiceBridge(Context context){ 
     this.context = context; 
    } 

    public void bindService(){ 
     Intent intent = new Intent(getContext(), MyService.class); 

     getContext().bindService(intent, this, getContext().BIND_AUTO_CREATE); 
     getContext().startService(intent); 
    } 

    // Here's a sample call, and the one that is relevant 
    public void start(Map<String, Object> options){ 
     setOptions(options); 
     if(bound == true){ 
      getMyService().start(options); 
     } 
     else{ 
      started = true; 
     } 
    } 
} 

ich die start Methode Brücke nennen, um zu laufen der Service. Dies funktioniert gut, außer in dieser speziellen Situation (bisher). Die MyApplication Klasse ruft die Startmethode der Brücke auf onCreate:

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 

     super.onCreate(); 

     getServiceBridge().start(null); 
    } 
} 

Dies wird according to the docs „aufgerufen, wenn die Anwendung gestartet wird, bevor irgendwelche Aktivitäten, Service oder Empfängerobjekten (ohne Content-Provider) erstellt wurden.“. Tatsächlich scheint es so zu sein, weil der Dienst nicht startet und stattdessen startet, wenn ich die App schließe (zumindest ungerade). Das funktioniert, wenn ich den Anruf an die Methode onCreate einer Aktivität verschiebe, aber das ist nicht ideal, weil ich den Dienst auch beenden kann und möchte, dass der Dienst für die gesamte Lebensdauer der App ausgeführt wird. Das heißt, der Dienst sollte starten, wenn die App gestartet wird, und anhalten, wenn die App beendet wird. Macht das Sinn? Gibt es einen anderen Weg, dies zu tun?

+0

'onCreate' Methode wird aufgerufen oder nicht von Application-Klasse? –

+0

Ja, die Methode wird aufgerufen! Diese und @ vanste25s Antwort hat mir jedoch klar gemacht, dass es etwas damit zu tun haben könnte, dass der Dienst immer noch im Hintergrund läuft. Ich sage das, weil die Methode beim zweiten Aufruf der App scheinbar nicht aufgerufen wird. –

Antwort

2

Meiner Meinung nach haben Sie einen guten Job gemacht, als Sie beschlossen haben, den Dienst in Application onCreate auszuführen. Aber es ist seltsam zu hören, dass der Dienst gestartet wird, wenn Sie die App schließen. Ich habe dies mehrmals getan, und der Dienst startet in der Anwendung onCreate, die aufgerufen werden muss.

Haben Sie überprüft, ob Ihre Anwendung aktiv ist und im Hintergrund läuft? Bitte stellen Sie sicher, dass Sie Ihre Anwendung vor dem Test getötet haben. Verwenden Sie Task Killer oder etwas ähnliches, um sicher zu sein, dass die Anwendung immer neu gestartet wird.

Leider hat Android keinen geeigneten Mechanismus, um Sie zu benachrichtigen, wenn die Anwendung beendet wird, da es noch aktiv ist, bis das System beschließt, es zu beenden und Ressourcen freizugeben.

+0

Ich sehe, so Dienste _do_ Arbeit, wenn dort gestartet. Das schließt aus, was ich dachte. Ich könnte wirklich eine Methode verwenden, wenn die Anwendung (oder der Dienst) beendet wird. Diese App ist ein wenig Bereinigung-empfindlich (es verwendet externe Geräte wie Router). Jetzt, wo ich weiß, dass Dienste dort gestartet werden können, gebe ich etwas mehr Zeit für das Debuggen. Vielen Dank! –

+0

Sie sind willkommen. Achten Sie darauf, dass startService und bindService sequenziell aufgerufen werden getContext(). BindService (intent, this, getContext(). BIND_AUTO_CREATE); getContext(). StartService (Absicht); Vielleicht ist da dein Problem. – vanste25

+0

Wirklich? Warum das? –