2013-01-03 40 views
3

我想製作一個android應用程序,它使用一些jni代碼。
這jni代碼分配一些內存,它必須被釋放。突然想到
假設我有包含此代碼這個類:Android活動生命週期和jni內存管理

class MyJniClass{ 

public native void jni_init(); //this allocates some memory 
public native void do_something(); //this also allocates some memory, 
which is linked to the memory allocated in jni_init() 
public native void jni_destroy(); //this frees all the allocated 
memory in two previous functions 

... // some other java code 

} 

我的問題是,在活動生命週期的哪個叫jni_initjni_destroy。所以我開始一些挖掘活動生命週期的工作原理,並對結果有點困惑。我想這是由於這個事實造成的,我試圖對linux進程的層次深入理解。但我正在使用jni,所以這是有道理的。

我創建了一個簡單的活動,實現了所有的生命週期回調並將一些日誌記錄放入其中。我對構造函數也做了同樣的事情,並且還添加了jni代碼,它記錄了該過程的pid

因此,我發現的 - 即使未調用onDestroy(這很明顯,我找到了很多解釋),並且該過程仍然是runnig(由使用時間線,ps命令和getpid jni調用)。該進程正在運行,因此分配內存似乎是合乎邏輯的。

問題是,在哪裏分配內存。我不能使用onCreate,因爲它可以在進程生命週期中多次調用,所以會發生內存泄漏。我也不想使用onStart進行分配和onStop來釋放,因爲這是不必要的工作。我試過單身設計,它似乎工作,但我不想使用它,因爲我需要MyJniClass是可重入的(我想在服務中使用它)。所以我的問題是 - 是否有一些建議的方式如何在jni應用程序中進行內存管理?

編輯: 我明白了,我沒有描述這個問題中最令人困惑的部分。下面是事件的sequens:

1)開始使用在啓動器中的圖標

2)新活動被創建(構建的應用程序)

3)的onCreate稱爲

4)在onStart被稱爲

5)的onResume被稱爲

6)我按下home鍵

7)的onSaveInstanceState稱爲

8)的onPause稱爲

9)的onStop稱爲

10)開始使用在啓動器中的圖標的應用程序(如步驟1)

11)新活動被創建(構造)

12)的onCreate稱爲

13)在onStart被稱爲

14)的onResume被稱爲

混亂的步驟11)和12),因爲該進程(PID)仍然是相同的,但是當我從資料瞭解,以前的過程應該如果被殺死11)和12)發生。

非常感謝所有的語法錯誤。

+0

「以前的過程應該被殺死,如果11)和12)發生。」 - >這不會發生? 你可以做一個更多的測試,檢查你的類的靜態構造函數何時被調用(任何'static {/ * code here * /}'在類級別的塊)。 – Geoffroy

+0

不,它沒有,pid仍然是一樣的。我還在活動類中添加了一個簡單的靜態計數器,每次onCreate被調用時它都會增加,並且它會增加。靜態構造函數中的代碼只被調用一次(當進程啓動時)。 – Pavel

回答

2

here

安卓finishOnTaskLaunch

無論活動的現有實例,應關閉(完)>每當用戶再次啓動它的任務(而選擇在家裏工作屏幕) - 如果應關閉,則爲「真」,否則爲「假」。默認值是「false」。

它清楚地表明,如果您希望您的活動只存在一次,您應該在AndroidManifest.xml中更改此值。

您還可以更改哪些其他值來影響活動生命週期行爲。

+0

謝謝。它有助於幫助。問題是,這隻有在活動從圖標開始時纔有效,而不是從另一個應用程序意圖開始。但它可能夠了。另一件事是,這個過程仍然是欺騙性的,但我想我無法控制這一點。我也嘗試了android:launchMode =「singleTop」,它似乎更好,但只有當我的應用程序中只有一項活動時纔有效。我認爲這解決了。 – Pavel

+0

如果您找到更好的解決方案,請告訴我! – Geoffroy