2013-09-23 18 views
1

我需要測試,如果這IntentService正在運行或不和已經創建了static方法isInstanceCreated()資格GC。它會在您看到真或假時返回。當是這個類在這個特殊的設置

我試圖瞭解發生什麼事希望你能跟着我..
現在,到底發生了什麼,如果在這裏:

1 - 我稱之爲isInstanceCreated()方關於GC 一個BroadcastReceiver(我的想法是,當BroadcastReceiver完成和資格GC,該IntentService也有資格GC)

2 - 如果我叫isInstanceCreated()Application關於GC 類(我的想法是IntentService是GC當Android的應用殺)

3-靜態類方法的訪問者將持有引用的東西..?

4-我知道,靜態最終字段硬編譯器編碼和訪問靜態最終字段時靜態的東西像靜態塊和領域類不會被裝載。但是當我調用isInstanceCreated()時,會發生什麼情況,靜態內容是從上到下加載的,因爲它是在代碼中寫入的。但是,當我撥打isInstanceCreated()時,內存消耗如何?當我用Newclass.forname實例化類並創建實例併爲孔類權限分配內存時。當我打電話給isInstanceCreated()時,整個班級也佔用了內存(當然,沒有人可以訪問非靜態內容,因爲它需要先實例化)。希望你遵循我的學習曲線,並可以給出一些答案。

public class MyIntentService extends IntentService { 
    private static boolean stopNow; 
    private Integer someInt = 10; 
    private static MyIntentService instance = null; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public MyIntentService() { 
     super("MyIntentService"); 
    } 

    public static boolean isInstanceCreated(){ 
     return instance != null; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

    } 
    public boolean someMethod(){ 

    { 
    // much more methods 
} 

我知道這對我的作品,但getRunningAppProcesses bad solution by Dianne Hackborn

回答

1

要確定您的服務是否仍在運行,看看答案this question。請注意,這與您鏈接的getRunningAppProcesses解決方案不同。

在目前的實現類的,isInstanceCreated()不會告訴你的服務是否正在運行;它只會告訴你是否存在MyIntentService的實例。靜態成員instance將在服務對象未設置爲空時泄漏服務對象(例如,在onDestroy()中)。

現在,如果真正發生在這裏:

1 - 我從關於廣播接收器的GC調用isInstanceCreated()(我的想法是,當廣播接收器的光潔度和資格GC,該IntentService也有資格GC)

2 - 如果我從應用類關於GC調用isInstanceCreated()(我的想法是IntentService是GC當Android的應用殺)

調用isInstanceCreated()沒有EFFE ct符合GC資格,因爲它不會創建或銷燬任何引用。

3-靜態類方法的訪問器將持有引用的東西..?

我不知道你的意思是「靜態類方法」。對MyIntentService的引用由靜態成員instance保存。如果您將instance設置爲null,那麼當服務完成運行時,MyIntentService將符合GC條件,並且Android會將其自己的引用刪除。

4- [...]當我打電話isInstanceCreated()的整個類也佔用存儲器[...]

當引用MyIntentService在第一時間,類裝載器的負載該類到內存中併爲其靜態成員分配內存。由於您的班級中只有兩個靜態成員,因此內存使用量會非常低。

+0

因此,當我調用'isInstanceCreated()'類加載器將靜態成員放入[JVM靜態部分](http://www.javatutorialhub.com/java-stack-heap.html),他們將留在那裏不會被刪除,直到我的應用程序被殺害。? 'getRunningServices'就是我現在使用的,但是想要離開它 – Erik

+1

這是正確的。 – acj

相關問題