Starten Sie die Android-Anwendung ohne Hauptaktivität und starten Sie den Dienst beim Starten der Anwendung

90

Ich habe das folgende Szenario in meiner Anwendung. In meiner Anwendung befindet sich keine Benutzeroberfläche. Stattdessen gibt es einen Dienst, der beim Booten startet und kontinuierlich ausgeführt wird.

Wie kann ich meine Manifestdatei ohne Hauptaktivität konfigurieren? Kann ich meine App ohne Aktivität starten? Und beim Starten meiner App sollte mein Dienst gestartet werden. Ist das möglich?

Ich möchte keine durchscheinende Aktivität ausführen, um den Dienst zu starten.

Meher
quelle
Schauen Sie sich diese [Frage] [1] [1] an: stackoverflow.com/questions/4468006/…
Munish Kapoor

Antworten:

125

Sie sagten, Sie wollten keine durchscheinende Aktivität verwenden, aber das scheint der beste Weg zu sein, dies zu tun:

  1. Setzen Sie in Ihrem Manifest das Aktivitätsthema auf Theme.Translucent.NoTitleBar.
  2. Kümmern Sie sich nicht um ein Layout für Ihre Aktivität und rufen Sie nicht an setContentView().
  3. onCreate()Starten Sie in Ihren Aktivitäten Ihren Service mit startService().
  4. Beenden Sie die Aktivität mit, finish()sobald Sie den Dienst gestartet haben.

Mit anderen Worten, Ihre Aktivität muss nicht sichtbar sein. Es kann einfach sicherstellen, dass Ihr Dienst ausgeführt wird, und dann beenden, was nach Ihren Wünschen klingt.

Ich würde dringend empfehlen, mindestens eine Toast-Benachrichtigung anzuzeigen, die dem Benutzer anzeigt, dass Sie den Dienst starten oder dass er bereits ausgeführt wird. Es ist eine sehr schlechte Benutzererfahrung, ein Startsymbol zu haben, das beim Drücken nichts zu tun scheint.

Darshan Rivka Whittle
quelle
2
Es gibt mir einen leeren Bildschirm nach dem Start meiner Anwendung. Was nicht der Fall sein sollte ...
Meher
1
@meher Ich habe es gerade getestet und es hat perfekt für mich funktioniert - mein Service wurde gestartet und ich habe selbst für einen Moment keine Aktivität gesehen. Bitte posten Sie den Inhalt von onCreate () Ihrer Aktivität, und wir sollten in der Lage sein, herauszufinden, was falsch ist.
Darshan Rivka Whittle
Wenn ich meine Anwendung zum ersten Mal installiert habe, kann ich sehen, dass die Aktivität in einer Sekunde gestartet wurde und verschwindet.
Meher
öffentliche Klasse TestActivity erweitert Aktivität {/ ** Wird aufgerufen, wenn die Aktivität zum ersten Mal erstellt wird. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("Aktivität", "Dienst starten"); startService (neue Absicht (TestActivity.this, MyService.class)); Fertig(); }}
Meher
1
Mir ist klar, dass dies eine alte Frage ist, aber sie scheint nicht mehr zu funktionieren. Das Ändern des Hauptaktivitätsthemas in Theme.Translucent.NoTitleBar oder Theme.Translucent.NoTitleBar.FullScreen bewirkt, dass eine ansonsten funktionierende Anwendung den Aktivitätsbildschirm kurz in eine zeigt, die immer die Meldung "Anwendung reagiert nicht mehr" anzeigt.
Alzee
32

Ja, Sie können dies tun, indem Sie einfach eine erstellen BroadcastReceiver, die Sie Servicebeim Start Ihrer Anwendung aufruft . Hier ist eine vollständige Antwort von mir.
Android - Dienst beim Booten starten

Wenn Sie kein Symbol / Launcher für Ihre Anwendung möchten, können Sie dies auch tun. Erstellen Sie einfach keine Aktivität mit

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

ServiceDeklarieren Sie einfach Ihre als normal deklariert.

Lalit Poptani
quelle
2
Es hört sich so an, als ob der Fragesteller mit dem Starten des ServiceStartvorgangs in Ordnung ist, möchte aber wissen, wie man kein Main hat Activity, sondern einfach sicherstellen, dass das ausgeführt Servicewird, wenn das Startsymbol gedrückt wird.
Darshan Rivka Whittle
2
Es hört sich jedoch so an, als wollten sie ein Startsymbol, das beim Drücken sicherstellt, dass der Dienst ausgeführt wird. Ihr Vorschlag entfernt einfach das Startsymbol.
Darshan Rivka Whittle
@LalitPoptani die Lösung ist in Ordnung. Aber mein Dienst wird nicht gestartet, bis ich mein Telefon boote.
Meher
4
Ich kann meine App nur mit SyncAdapter ohne MAIN, LAUNCHER in AndroidMenifest.xml starten. Ist Ihre Antwort wirklich wahr?
Sunghun
1
Ich habe den Absichtsfilter mit Aktions- und Kategorietags entfernt. Jetzt läuft die App nicht mehr im Android Studio
Nauman Ash
11

Der Grund, eine App ohne Aktivität oder Dienst zu erstellen, könnte darin bestehen, eine Homescreen Widget-App zu erstellen, die nicht gestartet werden muss.
Sobald Sie ein Projekt gestartet haben, erstellen Sie keine Aktivitäten mehr. Nachdem Sie das Projekt erstellt haben, klicken Sie einfach auf Ausführen. Android Studio wird sagen No default activity found.

Klicken Sie auf Konfiguration bearbeiten (Aus dem Run - Menü) und in der Startoption Teil setzte die Einführung Wert Nothing . Klicken Sie dann auf OK und führen Sie die App aus.

( Da es keine Launcher-Aktivität gibt, wird im Apps-Menü keine App angezeigt. )

Mahdi-Malv
quelle
Danke, das war genau mein Fall. Falls Sie "Konfiguration bearbeiten" nicht wie ich sehen, wählen Sie im Hauptmenü " Ausführen"> "Ausführen" und dann " Konfigurationen bearbeiten" .
pm_
6

Android Studio Version 2.3

Sie können einen Dienst ohne Hauptaktivität erstellen, indem Sie einige einfache Schritte ausführen. Sie können diese App über Android Studio installieren und wie eine normale App debuggen.

Erstellen Sie zunächst ein Projekt in Android Studio ohne Aktivität. Erstellen Sie dann Ihre Serviceklasse und fügen Sie den Service Ihrer AndroidManifest.xml hinzu

<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>

Gehen Sie nun in der Dropdown-Liste neben der Schaltfläche "Ausführen" (grüner Pfeil) zu "Konfigurationen bearbeiten" und wählen Sie in den "Startoptionen" "Nichts". Auf diese Weise können Sie Ihren Dienst installieren, ohne dass sich Android Studio darüber beschwert, keine Hauptaktivität zu haben.

Nach der Installation wird der Dienst NICHT ausgeführt, aber Sie können ihn mit diesem Befehl adb shell starten ...

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

Kann überprüfen, ob es läuft mit ...

ps | grep whatever

Ich habe es noch nicht versucht, aber Sie können wahrscheinlich auch Android Studio den Dienst automatisch starten lassen. Dies würde in diesem Menü "Konfigurationen bearbeiten" erfolgen.

Merc
quelle
Ich erhalte folgenden Fehler von der ADB-Shell: Starten des Dienstes: Absicht {cmp = com.example.wolk.myapp / .MyIntentService} Fehler: Nicht gefunden; Es wurde kein Dienst gestartet. LOGCAT zeigt: ActivityManager: Erlaube nicht, ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos