2015-10-22 223 views
0

我正面臨一些我根本不理解的事情,這可能來自我對Android非常陌生的事實。Android:應用程序重新啓動後服務未啓動

我啓動了一個創建服務的簡單活動。這裏沒有魔法。一切正常,當我啓動應用程序。但是如果我殺了它並在幾秒鐘內再次啓動它,我的服務不會啓動(我在我的服務的OnCreate()方法上添加了一個日誌,並且沒有顯示任何內容)。

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    Log.d(TAG, "ON CREATE"); 
    s_instance = this; 

    registerReceiver(deviceEventReceiver, new IntentFilter("com.horizon.watch.moto360.receiveDeviceEvent")); 

    setContentView(R.layout.activity_main); 
    //Launch default home page 
    defaultHomePage = (FrameLayout) findViewById(R.id.defaulthomepage); 
    defaultHomePage.setVisibility(View.VISIBLE); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    startService(new Intent(this, WearMessageListenerService.class)); 

} 

@Override 
protected void onDestroy() { 
    Log.d(TAG, "ON DESTROY"); 

    stopService(new Intent(this, WearMessageListenerService.class)); 
    unregisterReceiver(deviceEventReceiver); 
    super.onDestroy(); 
} 
+0

是您的服務清單文件中列出? – bubunyo

+0

是的。這很奇怪,就像我沒有及時銷燬服務,並且在我重新啓動應用程序時不能重新創建 – krakig

+0

如果服務正在運行,則開始對服務進行檢查 – bubunyo

回答

1

你的服務可能不啓動由於它已經在運行,由於onDestroy()不會被調用。

從的onDestroy()文檔:

注意:不要在這個方法被調用的地方不算保存 數據!例如,如果一個活動正在編輯內容提供商中的數據,則這些編輯應該在onPause()或onSaveInstanceState(Bundle)中提交,而不是在這裏提交。這種方法通常實現爲釋放資源,例如與 活動關聯的線程,以便在應用程序的其餘部分仍在運行時,被銷燬的活動不會離開這些東西。 有 情況下,系統簡單地殺死活動的託管 過程中無需調用它這個方法(或任何其他人),所以處理過程進入後 不應該被用來做是爲了保持周圍 東西遠。

此外,你說你「殺了」你的應用程序。我會假設你的意思是你使用任務管理器來關閉應用程序。這可能是您撥打onDestroy()的原因,因此您的原始服務可能不會停止(如您對問題的評論中所述)。只有在你的應用上調用了finish()時,才能真正保證onDestroy()方法的正確性。你可以測試這個。

在你onPause()方法,你可以叫isFinishing()來測試你的應用是否只是暫停,或者如果它實際上是在完成所有的方式。如果它實際上正在完成,您可以將您的stopService()電話實際停止服務。


編輯:在回答下面的評論... 這是如上所述,你會如何實現onPause()方法...

@Override 
protected void onPause() { 
    super.onPause(); 
    if(isFinishing()) { 
     Log.d("APP SHUTTING DOWN", "The app is shutting down and the service should be stopped."); 
     stopService(new Intent(this, WearMessageListenerService.class)); 
     unregisterReceiver(deviceEventReceiver); 
    } else { 
     Log.d("APP PAUSING", "The app has moved to the background, but is still active. The service should continue running."); 
    } 
} 
+0

當我查看日誌時,onDestroy()總是被調用。但是服務的onDestroy()會在幾秒鐘後被調用。這意味着如果我足夠快地重新啓動應用程序,服務中的onDestroy()不會被調用 – krakig

+0

@krakig - 正確,這就是爲什麼當您重新啓動應用程序時服務仍在運行。 'onDestroy()'方法不是清理代碼的好地方,因爲這種方式不可預知。還有一系列其他線程和進程,系統正在同時完成,因此您可能會遇到像這樣的計時問題。這就是Google正式推薦我在文檔中提到的方式的原因。你應該在'onPause()'中調用'stopService'並測試'isFinishing()'。 – NoChinDeluxe

+0

問題在於,當屏幕鎖定時(例如,活動觸發onPause(),因此這意味着我的服務將無法接收事件),所以我想保持它活動狀態。 – krakig

相關問題