2012-10-10 11 views
5

Chcę uruchomić Service po uruchomieniu aplikacji zamiast działania; a następnie wspomniana usługa uruchomi się pod numerem an Activity. Muszę to zrobić, ponieważ moja aplikacja musi działać ZAWSZE, a kiedy mówię ZAWSZE, mam na myśli ZAWSZE. Jedynym sposobem, w jaki udało mi się uniknąć OS, zabijając moją aplikację, jest uruchomienie usługi jako lepkiej i jeśli Android zabije moją aktywność lub moją usługę, natychmiast je uruchomię.Uruchom usługę od początku aplikacji, a nie działalność

Znalazłem to question, ale górna odpowiedź wydaje się raczej niezgrabna, czy ktoś ma lepszy pomysł?

PS: Wiem, że to nie wygląda na bardzo przyjazną aplikację, ale jest to bardzo szczegółowy scenariusz badań i nie jest przeznaczony dla zwykłych użytkowników, tj. Telefon jest używany wyłącznie do tego celu; ale nawet jeśli pamięć jest poświęcona mojej aplikacji, Android ciągle ją zabija ... Wszelkie wątpliwości, które mogłem mieć o rzekomym schemacie zarządzania pamięcią opartą na Androidzie, już nie istnieją.

+0

więc chcesz wiedzieć, jak uruchomić usługę? – keyser

+0

@roadkarom: w działaniu jest ** NO ** UI. Tam ** MOŻNA ** UI w działaniu - i robi to ogromną różnicę. –

+0

Teraz to zauważam. Mój błąd. –

Odpowiedz

10

Ogólnie Aktywność NIE musi pokazywać żadnego interfejsu użytkownika - zwykle to robi, ale NIE jest obowiązkowe. Możesz więc po prostu ustawić punkt początkowy aplikacji na swoją "niewidzialną" aktywność. I niewidoczne elementy zarówno tematycznie jak

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

lub po prostu Twój kod nie zrobi dowolny setContentView() i raz jest to praca jest wykonywana w onCreate(), rozpocząć inną działalność i zakończyć ten jeden z finish() - i nie UI będzie pop-up z że aktywność - w ten sposób można łatwo korzystać z wykonywania swojej pracy w działalności podklasy (co może być prostsze dla niektórych zadań) i nadal nie potrzebują żadnej 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

Ale czy uruchomienie funkcji jest obowiązkowe? Nie możesz pominąć tego kroku? –

+2

@rodkarom: Ikony Launchera są zawsze związane z działaniami. Dlatego jeśli chcesz, aby ikona programu uruchamiającego uruchamiała usługę, ikona uruchamiania musi uruchomić działanie, które uruchamia usługę. Zakłada to oczywiście, że "po uruchomieniu aplikacji" masz na myśli "kiedy użytkownik dotknie ikony programu uruchamiającego", ponieważ "aplikacje" nie są "uruchamiane" w systemie Android. – CommonsWare

+0

Sztuczka polega na tym, że uruchomienie systemu aplikacji wywoła ten element, do którego doszedł prawy "filtr intencji". Teoretycznie, ponieważ filtr intenet można przypisać do działania, usługi lub transmisji, każdy obiekt tego typu mógłby zostać uruchomiony (jednak nie próbowałem niczego poza aktywnością z punktu widzenia Launchera). Nadal nie widzę problemu z uruchamianiem aktywności bez interfejsu użytkownika, aby wykonać moją pracę konfiguracyjną. –

Powiązane problemy