2016-07-30 14 views
0

Wenn ich die App auf meinem Telefon starte, wird der Dienst onCreate 3-4 Mal in weniger als einer Sekunde aufgerufen.Android-Dienst, der mehrmals neu startet

andererseits ist das oncreate so eingestellt, dass es eine vom Thread abgeleitete Klasse startet, die die Netzwerk-IP des Geräts auf dem Logcat ausgibt.

weirdly jeder Aufruf oncreate gibt zufällig entweder die tatsächliche IP (192.168.1.xxx) oder die Loopback (127.0.0.1)

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

    TheService=this; 

    chargingState = GetChargingState(); 

    if(mainActivity!=null) 
     mainActivity.UpdateDisplay(chargingState); 

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 

    registerReceiver(new ChargingStateListener(),ifilter); 

    new NetworkHandler().findServer(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 


    return START_STICKY; 
} 

Funktion der IP in der Gewinde Klasse erhalten

public String GetOwnIPAddress() 
    { 
     try { 
      return InetAddress.getLocalHost().getHostAddress(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     return null; 

    } 

Antwort

1

Sie verfehlen Ihren Service.

OnCreate sollte niemals einen Thread starten. Alles sollte in onStartCommand oder später geschehen. Die Erstellung Ihres Dienstes bedeutet nicht, dass es läuft, das ist es, was onStartCommand bedeutet. Ihr Dienst kann nach dem Willen des Systems erstellt oder getötet werden, onCreate sollte ein Minimum an Beträgen machen.

Auf einer Seitennotiz- nie verwenden Sie Ihren Dienst als Singleton wie Sie mit TheService = das sind. Es kann Sie in alle möglichen Schwierigkeiten bringen, z. B. beim Abfragen eines angehaltenen Dienstes. Wenn Sie Funktionen für einen Dienst aufrufen müssen, binden Sie sie an und geben Sie eine Sammelmappe in onBind zurück, die auf Ihre API zugreift. Was Sie tun, wird Speicherlecks und Abstürze verursachen.

+0

Danke das Verschieben von Sachen zu onStartCommand funktioniert, aber die Adresse, die durch den Thread gedruckt wird, ist jetzt bei der Loopback-Adresse von 127.0.0.1 fest, aber das sollte seine eigene Frage sein – Allahjane

+0

Nun, das ist nicht wirklich falsch - die IP des lokalen Hosts ist 127.0.0.1 :) Siehe http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device für andere Möglichkeiten, um es zu bekommen –