2012-10-10 14 views
5

Voglio lanciare un Service quando l'app viene lanciata al posto di un'attività; e poi ha detto che il servizio avvierà an Activity. Devo farlo perché la mia app deve funzionare SEMPRE, e quando dico SEMPRE intendo SEMPRE. E l'unico modo in cui sono riuscito a evitare che il sistema operativo uccida la mia app è l'avvio di un servizio come appiccicoso e, se Android dovessi uccidere la mia attività o il mio servizio, li riavvierò immediatamente.Avvio del servizio dall'avvio dell'app, non dell'attività

Ho trovato questo question ma la risposta in alto sembra piuttosto maldestra, qualcuno ha un'idea migliore?

PS: So che questa non sembra un'app molto amichevole, ma questo è uno scenario di ricerca molto specifico e non è destinato agli utenti abituali, cioè il telefono è utilizzato esclusivamente per questo scopo; ma anche se la memoria è dedicata alla mia app, Android continua a ucciderlo di tanto in tanto ... Ogni dubbio che potrei avere sul presunto rigido schema di gestione della memoria di Android ora è finito.

+0

Così si vuole sapere come avviare un servizio? – keyser

+0

@roadkarom: c'è ** NO ** UI in Activity. Lì ** PU BE ESSERE ** UI in attività - e questo fa enorme differenza. –

+0

Ora me ne accorgo. Colpa mia. –

risposta

10

In generale L'attività NON deve mostrare alcuna interfaccia utente - di solito lo fa ma NON è obbligatoria. Quindi puoi semplicemente impostare il punto di partenza dell'app per la tua attività "invisibile". E mezzi invisibili sia a tema come

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

o semplicemente il codice non farà alcun setContentView() e una volta che il suo lavoro è fatto nel vostro onCreate(), si inizia un'altra attività e terminare questo con finish() - e nessun utente sarebbe pop-up da che l'attività - in questo modo si può facilmente beneficiare di fare il vostro lavoro in attività di sottoclasse (che può essere più semplice per alcune attività) e ancora non hanno bisogno di alcuna interfaccia utente:

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

Ma allora è obbligatorio iniziare un'attività? Non puoi saltare questo passaggio? –

+2

@rodkarom: le icone di avvio sono sempre legate alle attività. Quindi, se si desidera che un'icona di avvio attivi un servizio, l'icona di avvio deve avviare un'attività che attiva il servizio. Ciò, naturalmente, presuppone che "quando viene lanciata l'applicazione" intendi "quando l'utente tocca un'icona di avvio", poiché le "app" non vengono "avviate" in Android. – CommonsWare

+0

Il trucco è che per avviare il sistema di app si invocherà quell'elemento a cui è stato applicato 'intent-filter'. In teoria, dato che il filtro intenet può essere assegnato all'attività, al servizio o alla trasmissione, è possibile avviare qualsiasi oggetto di quel tipo (tuttavia non ho provato nulla oltre all'attività per gli intenti di Launcher). Ancora non vedo alcun problema a lanciare attività senza interfaccia utente solo per fare il mio lavoro di installazione. –

Problemi correlati