Avvia l'applicazione Android senza l'attività principale e avvia il servizio all'avvio dell'applicazione


90

Ho il seguente scenario nella mia applicazione. Non c'è interfaccia utente nella mia applicazione; invece c'è un servizio che si avvia all'avvio e continuerà a funzionare.

Come posso configurare il mio file manifest senza un'attività principale? Posso avviare la mia app senza alcuna attività? E all'avvio della mia app, il mio servizio dovrebbe iniziare. È possibile?

Non voglio creare un'attività traslucida per avviare il servizio.


avere uno sguardo a questo [domanda] [1] [1]: stackoverflow.com/questions/4468006/...
Munish Kapoor

Risposte:


125

Hai detto che non volevi utilizzare un'attività traslucida, ma questo sembra essere il modo migliore per farlo:

  1. Nel tuo manifest, imposta il tema dell'attività su Theme.Translucent.NoTitleBar.
  2. Non preoccuparti di un layout per la tua attività e non chiamare setContentView().
  3. Nella tua attività onCreate(), inizia il tuo servizio con startService().
  4. Esci dall'attività con finish()una volta avviato il servizio.

In altre parole, la tua attività non deve essere visibile; può semplicemente assicurarsi che il servizio sia in esecuzione e quindi uscire, il che suona come quello che desideri.

Consiglio vivamente di mostrare almeno una notifica di avviso popup che indica all'utente che stai avviando il servizio o che è già in esecuzione. È un'esperienza utente molto negativa avere un'icona di avvio che sembra non fare nulla quando la si preme.


2
mi dà uno schermo vuoto dopo aver avviato la mia applicazione, cosa che non dovrebbe essere il caso ...
Meher

1
@meher L'ho appena testato e ha funzionato perfettamente per me: il mio servizio è iniziato e non ho visto alcuna attività, nemmeno per un istante. Pubblica il contenuto della tua attività su onCreate () e dovremmo essere in grado di capire cosa non va.
Darshan Rivka Whittle

quando ho installato la mia applicazione per la prima volta posso vedere l'attività avviata e scomparire in un secondo.
Meher

public class TestActivity estende Activity {/ ** Chiamato quando l'attività viene creata per la prima volta. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("attività", "servizio di avvio"); startService (new Intent (TestActivity.this, MyService.class)); finire(); }}
Meher

1
Mi rendo conto che questa è una vecchia domanda, ma non sembra funzionare più. La modifica del tema dell'attività principale in Theme.Translucent.NoTitleBar o Theme.Translucent.NoTitleBar.FullScreen causa un'applicazione altrimenti funzionante che mostra brevemente la schermata dell'attività in una che causa sempre un messaggio "l'applicazione ha smesso di rispondere".
alzee

32

Sì, puoi farlo semplicemente creando un BroadcastReceivertuo che chiama Servicequando la tua applicazione si avvia. Ecco una risposta completa data da me.
Android: avvia il servizio all'avvio

Se non desideri alcuna icona / programma di avvio per la tua applicazione, puoi farlo anche tu, semplicemente non creare alcuna attività con

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Dichiara semplicemente il tuo Servicecome dichiarato normalmente.


2
Sembra che il richiedente stia bene con l' Serviceavvio all'avvio , ma vuole sapere come non avere alcun main Activity, ma semplicemente assicurarsi che Servicesia in esecuzione quando viene premuta l'icona del launcher.
Darshan Rivka Whittle

2
Ma sembra che vogliano un'icona di avvio che, se premuta, assicuri che il servizio sia in esecuzione. Il tuo suggerimento elimina semplicemente l'icona di avvio.
Darshan Rivka Whittle

@LalitPoptani la soluzione va bene, ma il mio servizio non si avvierà finché non avvio il mio telefono.
Meher

4
Non riesco ad avviare la mia app senza MAIN, LAUNCHER in AndroidMenifest.xml eccetto SyncAdapter. La tua risposta è davvero vera?
sunghun

1
Ho rimosso il filtro intent con tag di azione e categoria. Ora l'app non è più in esecuzione in Android Studio
Nauman Ash,

11

Il motivo per creare un'app senza attività o servizio potrebbe essere la creazione di un'app Homescreen Widget che non deve essere avviata.
Una volta avviato un progetto, non creare alcuna attività. Dopo aver creato il progetto, premi Esegui. Dirà lo studio Android No default activity found.

Fare clic su Modifica configurazione (dal menu Esegui ) e nella parte delle opzioni di avvio impostare il valore di avvio su Nothing . Quindi fare clic su OK ed eseguire l'app.

( Poiché non è presente alcuna attività di avvio, nel menu App non verrà visualizzata alcuna app. ).


Grazie, era esattamente il mio caso. Nel caso in cui non si vede Modifica configurazione come ho fatto, selezionare Esegui> Esegui ... dal menu principale e poi selezionare Modifica configurazioni ... .
pm_

6

Android Studio versione 2.3

Puoi creare un servizio senza un'attività principale seguendo alcuni semplici passaggi. Potrai installare questa app tramite Android Studio ed eseguirne il debug come una normale app.

Innanzitutto, crea un progetto in Android Studio senza un'attività. Quindi crea la tua classe Service e aggiungi il servizio al tuo AndroidManifest.xml

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

Ora, nel menu a discesa accanto al pulsante "Esegui" (freccia verde), vai su "modifica configurazioni" e all'interno delle "Opzioni di avvio" scegli "Niente". Ciò ti consentirà di installare il tuo servizio senza che Android Studio si lamenti di non avere un'attività principale.

Una volta installato, il servizio NON sarà in esecuzione ma sarai in grado di avviarlo con questo comando adb shell ...

am startservice -n com.whatever.myservice/.MyService

Posso controllare che funzioni con ...

ps | grep whatever

Non ho ancora provato, ma è probabile che anche Android Studio avvii automaticamente il servizio. Questo dovrebbe essere fatto in quel menu "Modifica configurazioni".


Ottengo il seguente errore dalla shell di adb: Avvio del servizio: Intent {cmp = com.example.wolk.myapp / .MyIntentService} Errore: non trovato; nessun servizio avviato. LOGCAT mostra: ActivityManager: non consentire l'avvio di ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.