2012-07-13 71 views
15

我正在開發使用藍牙通信(使用propetary協議)的Android應用程序,我需要捕捉的瞬間,當應用程序被殺害。Android應用好好嘗試一下叫「的onDestroy()」時被殺(ICS)

我想用「的onDestroy()」方法,但它不叫每一個應用程序被消磨時間。 我注意到,當我按下後退按鈕時會調用它,並且有時僅當我從任務管理器中終止應用程序時纔會調用它。

問題是:如何捕捉應用程序被殺之前的那一刻?

這裏是我嘗試使用代碼:

@Override 
public void onDestroy() { 
    sendMessage(msg); 
    Log.d("SampleApp", "destroy"); 
    super.onDestroy(); 
} 

@Override 
public void finish(){ 

    sendMessage(msg); 
    Log.d("SampleApp", "finish"); 
    super.finish(); 
} 

不幸的是結束(),不會被調用的onDestroy不叫我每次從任務管理器關閉應用程序的時間。

我該如何處理?

+0

您的意思是當應用程序被系統殺死,當用戶在設置中按下強制停止,或者只是在查看活動時按下HOME或BACK按鈕時? – Devunwired 2012-07-13 15:48:48

+0

他們兩個對我來說都不錯,我想趕上用戶從任務管理器中殺死應用程序的時刻(或者長按主屏幕並從那裏殺死應用程序,在冰淇淋三明治中),但也可以捕捉用戶按HOME或BACK按鈕查看我的活動的時刻。 – 2012-07-13 15:51:09

回答

13

如文檔here中陳述,沒有保證的onDestroy()永遠不會被調用。相反,使用onPause()可以在應用程序移動到後臺時執行您想要執行的操作,並且僅在您的應用程序被終止時運行的onDestroy()中保留該代碼。

編輯:

從您的意見,似乎你想,只要你的應用程序進入後臺運行一些代碼,但如果因爲你發起的意圖它走進後臺。據我所知,有在Android中沒有一種方法,默認情況下處理這個,但你可以使用這樣的事情:

有這樣一個布爾值:

boolean usedIntent = false; 

現在使用的意圖之前,布爾設置爲true。現在,在您的onPause(),移動的意圖情況下,代碼爲IF塊像這樣的:

if(usedIntent) 
{ 
//Your code 
} 

最後,在你的onResume(),再布爾設置爲false,以便它可以處理你的應用程序被非意圖移動到背景中意味着正確。如果過程中它通過外部手段終止(即用於殺死存儲器原因或用戶強制停止應用程序)

+0

我已經讀過它,但問題是,如果我把我的代碼放在onPause()中,如果我在我的應用程序中開始一個新的意圖,它也會被執行。 相反,只有當onPause被調用才能返回主屏幕時,我纔會發送消息 – 2012-07-13 15:54:39

+0

只有主屏幕或另一個應用程序,如來電時或用戶查看通知? – 2012-07-13 15:56:15

+0

假設我想知道每當我的應用程序不再顯示(因此無論出於何種原因都以後臺爲背景),但是當意圖啓動時我不想做任何事情,因爲我從我的應用程序開始了新的意圖 – 2012-07-13 15:59:19

13

你的應用將不會接收任何附加的回調。當您的應用程序進入應用程序清理的後臺時,您將不得不處理您收到的回調。

finish()僅在用戶按下活動的BACK按鈕時才被系統調用,儘管它通常由應用程序直接調用以保留Activity並返回到前一個。這在技術上不是生命週期回調。

onDestroy()僅在調用finish()時才被調用Activity,因此主要僅在用戶點擊BACK按鈕時纔會被調用。當用戶點擊HOME按鈕時,前臺活動只會經過onPause()onStop()

這意味着,Android不給活動提供更多的反饋信息來區分用戶回家與移動到另一個活動(從您的應用程序或任何其他);活動本身只是知道它不再處於前臺。Android應用程序更像是一個鬆散的活動集合,而不是一個緊密集成的單一概念(就像您可能在其他平臺上使用過的一樣),因此沒有真正的系統回調來知道您的應用程序整體已被提出或向後移動。

最終,如果您的應用程序體系結構依賴於您的應用程序中的ANY Activity是否處於前景的知識,我強烈建議您重新考慮您的應用程序體系結構,但根據您的需求,可能還有其他方式更適合框架做到這一點。一種選擇是在您的應用程序內實現一個綁定Service,每個Activity綁定到活動時(即在onStart()onStop()之間)。這爲您提供的是能夠利用限制Service只限於客戶端綁定的事實的能力,因此您可以監視onCreate()onDestroy()方法的服務以瞭解當前前臺任務何時不是部分的應用程序。

您也許會發現Dianne Hackborn編寫的this article更有趣,涵蓋了Android架構以及Google如何認爲它應該被使用。

+0

我認爲這是更正確的方式,我認爲他還應該在應用程序中添加一個接口(或抽象類)以強制新添加的活動(或組件)來爲此定義行爲。 – 2014-04-07 15:12:06

+0

https://developer.android.com/guide/components/activities/activity-lifecycle.html – 2017-06-24 08:59:56

0

我剛剛解決了類似的問題。

如果它的只是關於停止服務當通過從最近的應用程序列表中滑動來終止應用程序時,您可以執行以下操作。

在您的Manifest文件中,請將stopWithTask標記爲true for Service。像:

<service 
    android:name="com.myapp.MyService" 
    android:stopWithTask="true" /> 

但正如你說你要取消註冊監聽器和停止的通知等,我建議這種做法:

  1. 裏面你的清單文件,守旗stopWithTaskfalse的服務。像:

    <service 
        android:name="com.myapp.MyService" 
        android:stopWithTask="false" /> 
    
  2. 現在,在您MyService服務,覆蓋方法onTaskRemoved。 (僅當stopWithTask設置爲false時纔會觸發此功能)。

    public void onTaskRemoved(Intent rootIntent) { 
    
        //unregister listeners 
        //do any other cleanup if required 
    
        //stop service 
        stopSelf(); 
    } 
    

參考my question更多細節,其中包含的代碼,另一部分了。

  • 開始像下面
  • startService服務(新意圖(此,MyService.class));

    希望這會有所幫助。

    相關問題