2013-07-20 58 views
2

我的應用程序具有在同一進程中運行的活動和服務。當用戶通過單擊「停止」按鈕終止活動時,活動導致服務終止。活動中止時的服務通知

從Android文檔我的理解,該系統可以殺死一個過程,回收資源:

「一旦你的活動已停止,如果需要恢復系統內存的系統可能會破壞實例在極端情況下,該系統可以簡單地殺死你的應用程序,而無需調用該活動的最終的onDestroy()回調,......」

問題1:是否有可能被殺死了我的活動,但不是服務?我寧願我的服務保持活力。

如果答案是「是」,那麼

問題2:是否存在這樣的服務可以通知該活動已被殺害的機制?

IBinder.linkToDeath有我需要的功能,但似乎適用於一個過程,而不是一個活動。

我想到了一個間接法一樣具有活性採取信號燈的所有權,並具有服務使用一個線程等待就可以了。然後,當活動被殺死時,它會釋放信號量,服務會得到它,提供通知。但是我想知道是否沒有我可以使用的以Android爲中心的技術。

[開始編輯]

讀你所提供的非常有益的意見後,我想澄清,我提出的方案。

我已經開始了兩個組件:一個活動和一個服務。應用程序已配置,以便服務可以在活動停止並銷燬後繼續運行。用戶可以多次重新啓動/啓動活動,並且它將使用相同的服務實例。

通常活動會通知它的onDestroy期間被摧毀的服務()。但是可能不會調用onDestroy()。

我想知道是否有一些我可以用它來通知該活動已被殺死,而不調用它的onDestroy服務Android的具體機制()已作出方法。

[編輯完]

感謝您的幫助。

意願

+0

殺害。您可以傳遞活動受到在的onDestroy()的處理程序將消息發送到服務摧毀,或者您可以使用LocalBroadcastManager –

+0

@Marcin:我的印象是從讀取,一個活動被殺害時,各個崗位,它的ISN的onDestroy不叫。我不擔心服務被殺。我是否正確閱讀您的回覆?謝謝回答。 – Will

+0

通常會調用onDestroy。但是如果系統需要更多的內存,它可以殺死整個應用程序(包括所有活動和服務)。它不會導致死亡只是一個活動,而無需調用的onDestroy –

回答

0

正如我之前所說的,單一的活動將不會受到機器人無需調用的onDestroy()殺死。如果Android的需要更多的內存,它殺死整個過程(包括所有活動和服務)。 Here是說明,文檔對此是錯誤的。

服務可以在其它過程中也創造了,但它必須設置INT清單。然後,如果通過Context.startService啓動服務,它不會被activity.finish殺死後(),您可以使用iBinder得到通知,當過程(所有活動)是由Android

+0

當我閱讀你的第二條評論時,我重讀了前一篇,並看到了鏈接。對於那個很抱歉。我編寫了一個很長的答案,並試圖發佈它,但得知我不能再發布4個小時。我讀過馬克的帖子,戴安娜的帖子,以及對戴安娜的帖子的評論。這些評論表明,如果文件錯誤,應該糾正。這是2011年。從2011年11月21552號正式提出這一要求。儘管如此,它還沒有改變。貓頭鷹似乎不同意這個問題。我會看看我是否有辦法殺死這個活動並看看會發生什麼。謝謝你的幫助。 – Will

+0

你的答案很有用,但我太新了,無法投票。 – Will

+0

來自commonsware的有趣帖子和我之前沒有讀過的。 – jsrsoftware

0

是的服務和活動可以彼此獨立運行。

爲了實現你想要做的事情,我會在你的activity的onStart()函數(或者你希望啓動它的任何地方)中使用startService()明確地啓動你的服務,並且在同一點綁定它。沒有顯式startService的綁定會導致服務在您終止活動時停止(除非某些其他活動仍然與其綁定)。

在你活動的的onStop()調用您的服務功能來告訴它的活動已被殺害。

在你的活動:

private ServiceRecordJourney yourService; 
private ServiceConnection serviceConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, IBinder service) { 

     YourServiceBinder binder = (YourServiceBinder) service; 
     yourService= binder.getService(); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
    } 
}; 

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

    startService(new Intent(this, YourService.class)); 

    // Bind to Service 
    Intent intent= new Intent(this, YourService.class); 
    bindService(intent, serviceConnection , Context.BIND_AUTO_CREATE); 
} 

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

    if(yourService != null){ 
       yourService.activityKilledFunction(); 
     unbindService(serviceConnection); 
    } 
} 

您的服務將需要前臺(並顯示通知)從被OS殺死,以進一步阻止它。同樣,因爲它已經被明確地啓動,你將需要處理服務的明確停止(或者在服務上調用stopSelf()或者在上下文對象中調用stopService()。

你可以使用多個startService )呼叫有不同的意圖,但我更喜歡上述方法(並且我相信在案例綁定是更好的方法)。

同樣,服務運行時,活動將綁定和解除綁定到服務每次活動啓動或用戶停止。

+0

感謝您的回覆。如果我理解正確,你說的是一個活動總是知道它正在被殺死 - 在殺死它之前系統會停止活動。這是一種解脫,因爲我認爲系統會'殺死'它(像'kill -9'),並且它沒有機會執行任何清理。我有沒有得到那個權利? – Will

+0

不完全。一旦活動被「暫停」(在蜂窩前蜂窩上的onPause()之後,以及蜂窩加上的onStop()之後),操作系統可以在不調用生命週期的其餘部分(onStop()或onDestory等)的情況下關閉活動。任何狀態保存或通信應在生命週期中的「暫停」點之前完成。生命週期的文檔幾乎涵蓋了一切:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle – jsrsoftware

+0

我重新檢查你指着但似乎可以找到答案我的問題的文件。 「任何狀態保存或通信都應在生命週期中的」暫停「點之前完成。」我希望我的服務在活動暫停時繼續運行。每次活動暫停時,我都不想保存狀態。它可能會暫停並重新啓動任意次數。我想知道它是否被殺死。我認爲可以殺死活動,但應用程序可能會繼續運行,並在稍後由用戶再次啓動該活動。如果我沒有道理,我很抱歉;我會重讀你的參考。 – Will