2011-12-13 12 views
24

Ho un'applicazione che si propone di eseguire solo come servizio (nessuna interfaccia, basta eseguire in background). Non ho alcuna attività menzionata nel mio AndroidManifest.xml ma metto un ricevitore per avviare l'applicazione all'avvio del telefono.Avvia un'applicazione Android senza attività

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <service 
     android:enabled="true" 
     android:name=".MyAppService"> 
     <intent-filter> 
      <action 
       android:name = "me.myapp.MyAppService"> 
      </action> 
     </intent-filter> 
    </service> 
    <receiver 
     android:enabled="true" 
     android:name=".BootReceiver"> 
     <intent-filter> 
      <action android:name = "android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
    </receiver> 
</application> 

Il problema è che, come sto sviluppando (utilizzando Eclipse) la domanda, ho bisogno di testare i miei cambiamenti spesso. Quando eseguo l'applicazione (con il mio telefono collegato in modalità debug), ho un messaggio del tipo

[2011-12-14 00:18:40 - MyApp] Android Launch! 
[2011-12-14 00:18:40 - MyApp] adb is running normally. 
[2011-12-14 00:18:40 - MyApp] No Launcher activity found! 
[2011-12-14 00:18:40 - MyApp] The launch will only sync the application package on the device! 
[2011-12-14 00:18:40 - MyApp] Performing sync 

Come posso avviare l'applicazione in fase di esecuzione, senza dover riavviare ogni volta?


Modifica questo non è più possibile per Android 3.1 o superiore. Source

risposta

33

Oltre alle due opzioni menzionate da EboMike: è sempre possibile inviare la trasmissione BOOT_COMPLETED tramite la riga di comando anziché riavviare il telefono.

Usa

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED 

Questo si tradurrà in una situazione come dopo un riavvio reale, e sarà anche innescare eventuali applicazioni 3rd party ricevitori di avvio. Dopo averlo digitato una volta in un terminale, di solito è possibile ripeterlo semplicemente premendo il tasto freccia su, seguito dal ritorno sulla maggior parte dei sistemi operativi. Oppure puoi includerlo in uno script attivato dopo aver reinstallato la tua app.


Se si desidera limitare la trasmissione solo la vostra applicazione, è possibile anche specificare un componente:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n your.app.packagename/.YourReceiverClassName 

questo invia il riavvio trasmessi solo al ricevitore. Tutte le altre app non vengono chiamate.

+0

Grazie, bel modo di andare. Forse posso anche creare il mio evento che solo la mia applicazione può catturare per evitare conflitti con altre app di terze parti. –

+1

@MartinTrigaux Abbiamo appena controllato i documenti e ricordato che è possibile specificare un componente per ottenerlo. Vedi la mia modifica. –

2

Opzione 1: aggiungere un'attività fittizia che avvierà il servizio. Rimuoverlo prima della spedizione.

Opzione 2: creare una seconda applicazione di test che avvia il servizio.

+0

facile e di lavoro, grazie –

+0

Come sarà l'applicazione comporterà in fase di esecuzione? Cosa farà funzionare l'applicazione? In esecuzione dopo l'avvio non è abbastanza buono, come Android può uccidere il processo. Cosa lo avvierà di nuovo? –

1

Al via il servizio utilizzando il ricevitore broadcast attraverso qualsiasi intenti come

android.intent.action.BOOT_COMPLETED

non è possibile al di sopra Android 3.1 fino a quando l'utente utilizza la vostra applicazione, e, quindi, di utilizzare la vostra applicazione ci deve essere un unico attività non dell'interfaccia utente (che può chiamare finish in oncreate()).

See the proof here