2016-07-30 94 views
0

當我在手機上啓動應用程序時,服務的onCreate在不到一秒內被調用3-4次。Android服務重新啓動多次

另一方面,oncreate被設置爲啓動一個線程派生類,該類可以在logcat上打印設備的網絡IP。

古怪每次調用OnCreate中隨機給出任何實際的IP(192.168.1.xxx)或回送(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; 
} 

函數獲取IP的線程類

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

    } 

回答

1

您正在對您的服務進行misarchitecture。

OnCreate永遠不應該啓動一個線程。任何這樣的事情都應該在onStartCommand或更高版本中完成。創建您的服務並不意味着它的運行,這就是onStartCommand的含義。您的服務可能會根據系統的意願而創建或中止,onCreate應該儘量減少。

在旁邊注意 - 不要像使用TheService = this一樣將您的服務用作單例。它會讓你陷入各種麻煩,比如查詢停止的服務。如果您需要調用服務上的函數,請綁定到它並在onBind中返回一個訪問您的API的Binder。你在做什麼會導致內存泄漏和崩潰。

+0

感謝移動東西到onStartCommand工作,但由線程打印的地址現在卡在環回地址127.0.0.1,但這應該是它自己的問題 – Allahjane

+0

嗯,這實際上並不錯 - 本地主機的IP是127.0.0.1 :)請參閱http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device獲取它的其他方式 –