2012-10-10 213 views
5

當啓動應用程序而不是活動時,我想啓動Service;然後說服務將啓動an Activity。我需要這樣做,因爲我的應用程序需要始終運行,而當我說總是我的意思是總是。而我設法避免操作系統殺死我的應用程序的唯一方法是通過啓動服務作爲粘滯,並應該Android殺死我的活動或我的服務,我會馬上重新啓動它們。從應用程序啓動而不是活動啓動服務

我發現這個question,但最好的答案似乎相當笨拙,任何人有更好的主意? PS:我知道這看起來不是一個非常友好的應用程序,但這是一個非常具體的研究場景,它不適用於普通用戶,即手機僅用於此目的;但即使內存專用於我的應用程序,Android仍然會不時發現它......我對Android的聲稱嚴格的內存管理方案可能存在任何疑問,現在已經消失。

+0

所以,你想知道如何啓動服務? – keyser

+0

@roadkarom:活動中有**無** UI。有**可以**活動中的用戶界面 - 這有很大的不同。 –

+0

我現在注意到了。我的錯。 –

回答

10

一般活動不必顯示任何用戶界面 - 它通常會這樣做,但它不是強制性的。因此,您可以簡單地將應用程序的起點設置爲「無形」活動。和無形的方式,無論主題爲

android:theme="@android:style/Theme.NoDisplay" 

或只是你的代碼不會做任何setContentView(),一旦它的任務是在你的onCreate()完成後,啓動另一個活動,並終止這一次與finish() - 無UI會從彈出該活動 - 這樣你可以很容易地從活動子做你的工作(這可能是一些任務簡單)中獲益,仍然不需要任何UI:

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    // [... do your job here...] 

    // we're done, so let's jump to another acitivity 
    // this can be skipped if you do not want to jump anywhere 

    Intenet intent = new Intent(....) 
    ... 

    try { 
     startActivity(intent); 

     // finish him 
     finish(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

但是,然後開始一個活動是強制性的?不能跳過這一步? –

+2

@rodkarom:啓動器圖標總是與活動相關聯。因此,如果您想讓啓動器圖標觸發服務,啓動器圖標需要啓動觸發服務的活動。這當然假設「當應用程序啓動時」的意思是「當用戶點擊啓動器圖標時」,因爲「應用程序」不是在Android中「啓動」的。 – CommonsWare

+0

訣竅是,啓動應用程序系統將調用那個正確連接了'intent-filter'的元素。從理論上講,因爲intenet-filter可以分配給活動,服務或廣播,所以這種類型的任何對象都可以啓動(但是我沒有在啓動器意圖的活動旁邊嘗試任何東西)。不過,我認爲沒有UI的啓動活動只是爲了完成我的設置工作。 –