Lancez l'application Android sans activité principale et démarrez le service au lancement de l'application

90

J'ai le scénario suivant dans mon application. Il n'y a pas d'interface utilisateur dans mon application; à la place, il y a un service qui démarre au démarrage et fonctionnera en continu.

Comment puis-je configurer mon fichier manifeste sans activité principale? Puis-je lancer mon application sans aucune activité? Et au lancement de mon application, mon service devrait démarrer. Est-ce possible?

Je ne souhaite pas créer d'activité translucide pour démarrer le service.

Meher
la source
jetez un œil à cette [question] [1] [1]: stackoverflow.com/questions/4468006/…
Munish Kapoor

Réponses:

125

Vous avez dit que vous ne vouliez pas utiliser d'activité translucide, mais cela semble être la meilleure façon de le faire:

  1. Dans votre manifeste, définissez le thème Activité sur Theme.Translucent.NoTitleBar.
  2. Ne vous embêtez pas avec une mise en page pour votre activité et n'appelez pas setContentView().
  3. Dans votre activité onCreate(), démarrez votre service avec startService().
  4. Quittez l'activité avec finish()une fois que vous avez démarré le service.

En d'autres termes, votre activité n'a pas besoin d'être visible; il peut simplement s'assurer que votre service est en cours d'exécution, puis quitter, ce qui ressemble à ce que vous voulez.

Je recommande vivement d'afficher au moins une notification Toast indiquant à l'utilisateur que vous lancez le service ou qu'il est déjà en cours d'exécution. C'est une très mauvaise expérience utilisateur d'avoir une icône de lanceur qui semble ne rien faire lorsque vous appuyez dessus.

Darshan Rivka Whittle
la source
2
cela me donne un écran vide après le lancement de mon application, ce qui ne devrait pas être le cas ...
Meher
1
@meher Je viens de le tester et cela a parfaitement fonctionné pour moi - mon service a démarré et je n'ai vu aucune activité, même pendant un instant. Veuillez publier le contenu de votre activité onCreate (), et nous devrions être en mesure de déterminer ce qui ne va pas.
Darshan Rivka Whittle
lorsque j'ai installé mon application pour la première fois, je peux voir l'activité lancée et disparaître en une seconde.
Meher
public class TestActivity extends Activity {/ ** Appelé lorsque l'activité est créée pour la première fois. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("activité", "service de démarrage"); startService (nouvelle intention (TestActivity.this, MyService.class)); terminer(); }}
Meher
1
Je me rends compte que c'est une vieille question, mais elle ne semble plus fonctionner. La modification du thème d'activité principal en Theme.Translucent.NoTitleBar ou Theme.Translucent.NoTitleBar.FullScreen provoque une application qui fonctionne autrement qui affiche brièvement l'écran d'activité en un qui provoque toujours un message «application a cessé de répondre».
alzee
32

Oui, vous pouvez le faire en créant simplement un BroadcastReceiverqui appelle votre Servicelorsque votre application démarre. Voici une réponse complète donnée par moi.
Android - Démarrer le service au démarrage

Si vous ne voulez aucune icône / lanceur pour votre application, vous pouvez le faire également, ne créez simplement aucune activité avec

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

Déclarez simplement votre Servicecomme déclaré normalement.

Lalit Poptani
la source
2
Il semble que le demandeur est bien pour démarrer Servicele démarrage, mais veut savoir comment ne pas avoir de main Activity, mais assurez-vous simplement que le Serviceest en cours d'exécution lorsque l'icône du lanceur est enfoncée.
Darshan Rivka Whittle
2
Mais il semble qu'ils veulent une icône de lanceur qui, lorsqu'elle est enfoncée, garantit que le service est en cours d'exécution. Votre suggestion supprime simplement l'icône du lanceur.
Darshan Rivka Whittle
@LalitPoptani, la solution est bonne, mais mon service ne démarrera pas tant que je n'aurai pas démarré mon téléphone.
Meher
4
Je ne peux pas démarrer mon application sans MAIN, LAUNCHER dans AndroidMenifest.xml sauf SyncAdapter. Votre réponse est-elle vraiment vraie?
sunghun
1
J'ai supprimé le filtre d'intention avec des balises d'action et de catégorie. Maintenant, l'application ne fonctionne plus dans le studio Android
Nauman Ash
11

La raison de créer une application sans activité ni service pourrait être la création d'une application Widget d'écran d'accueil qui n'a pas besoin d'être démarrée.
Une fois que vous démarrez un projet, ne créez aucune activité. Après avoir créé le projet, appuyez simplement sur Exécuter. Le studio Android dira No default activity found.

Cliquez sur Modifier la configuration (dans le menu Exécuter ) et dans la partie Option de lancement, définissez la valeur de lancement sur Rien . Cliquez ensuite sur OK et exécutez l'application.

( Comme il n'y a pas d'activité du lanceur, aucune application ne sera affichée dans le menu Applications. ).

Mahdi-Malv
la source
Merci, c'était exactement mon cas. Si vous ne voyez pas Modifier la configuration comme moi, sélectionnez Exécuter> Exécuter ... dans le menu principal, puis sélectionnez Modifier les configurations ... .
pm_
6

Android Studio version 2.3

Vous pouvez créer un service sans activité principale en suivant quelques étapes simples. Vous pourrez installer cette application via Android Studio et la déboguer comme une application normale.

Tout d'abord, créez un projet dans Android Studio sans activité. Créez ensuite votre classe Service et ajoutez le service à votre 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>

Maintenant, dans le menu déroulant à côté du bouton "Exécuter" (flèche verte), allez dans "Modifier les configurations" et dans les "Options de lancement" choisissez "Rien". Cela vous permettra d'installer votre service sans qu'Android Studio ne se plaint de ne pas avoir d'activité principale.

Une fois installé, le service ne fonctionnera PAS mais vous pourrez le démarrer avec cette commande adb shell ...

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

Peut vérifier qu'il fonctionne avec ...

ps | grep whatever

Je n'ai pas encore essayé, mais vous pouvez probablement demander à Android Studio de démarrer automatiquement le service également. Cela serait fait dans le menu "Modifier les configurations".

Merc
la source
J'obtiens l'erreur suivante du shell adb: Service de démarrage: Intention {cmp = com.example.wolk.myapp / .MyIntentService} Erreur: non trouvée; aucun service n'a démarré. LOGCAT affiche: ActivityManager: ne pas autoriser le démarrage de ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos