Comment démarrer mon application au démarrage?

241

J'ai essayé d'utiliser l'exemple de code dans ce lien, mais il semble obsolète et cela n'a pas fonctionné. Alors, quels changements dois-je apporter et à quels fichiers pour que mon application démarre automatiquement lorsque Android a terminé le démarrage?

Poojan
la source

Réponses:

315

Tout d'abord, vous avez besoin de l'autorisation dans votre AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

De plus, dans votre AndroidManifest.xml, définissez votre service et écoutez l' action BOOT_COMPLETED :

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Ensuite, vous devez définir le récepteur qui obtiendra l' action BOOT_COMPLETED et démarrer votre service.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

Et maintenant, votre service devrait fonctionner au démarrage du téléphone.

Sean Schulte
la source
8
Activités: developer.android.com/guide/topics/fundamentals/activities.html Services: developer.android.com/guide/topics/fundamentals/services.html Pour démarrer votre application lorsque le téléphone démarre, vous devez enregistrez le service comme indiqué ci-dessus, puis vous pouvez utiliser startActivity () pour démarrer votre application. Ce n'est pas une bonne idée de mettre un écran devant l'utilisateur s'il ne le demande pas.
Sean Schulte
19
Je voulais juste ajouter qu'il serait préférable d'utiliser Intent.ACTION_BOOT_COMPLETEDau lieu de coder en dur la chaîne dans votre récepteur. Vous devez également utiliser le nouveau Intent(context, MySystemService.class)constructeur lors de la création de l'intention.
brianestey
7
Y a-t-il une raison de vérifier le type d'intention si le filtre d'intention est utilisé?
Pijusn
1
Pour une raison im obtenir Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filesur la public classligne. Des idées?
pattyd
3
Qu'est-ce que MySystemService?
sports
120

Voici comment démarrer une activité après le redémarrage de l'appareil Android:

Insérez ce code dans votre AndroidManifest.xmlfichier, à l'intérieur de l' <application>élément ( pas à l'intérieur de l' <activity>élément):

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

Créez ensuite une nouvelle classe yourActivityRunOnStartup(correspondant à celle android:namespécifiée pour l' <receiver>élément dans le manifeste):

package yourpackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

Remarque: L'appel i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);est important car l'activité est lancée à partir d'un contexte extérieur à l'activité. Sans cela, l'activité ne démarre pas.

En outre, les valeurs android:enabled, android:exportedet android:permissiondans l' <receiver>étiquette ne semblent pas obligatoire. L'application reçoit l'événement sans ces valeurs. Voir l'exemple ici .

thrylos
la source
J'aime ce "raccourci" pour éviter d'avoir à faire un service local. Ce code appartient-il à la classe qui s'étend Application? Peut-être à l'intérieur onCreate()?
Quelqu'un quelque part
2
il ressemble à ce paragraphe du code devrait être dans onReceive()unBroadcastReceiver
Quelqu'un Quelque part
2
Ce code devrait être dans l'activité à savoir "yourActivityrRunOnStartup" qui étend la classe BroadcastReceiver et la méthode onReceive ().
thrylos
2
J'ai essayé de donner 10 votes positifs, mais je n'ai pas pu. Désolé et merci.
Sayka
1
Cela a fonctionné pour moi, mais UNIQUEMENT si je n'avais que "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" dans le filtre d'intention. Si j'ai utilisé les deux autres, cela n'a pas fonctionné.
emhomm4
67

Écoutez ACTION_BOOT_COMPLETE et faites ce dont vous avez besoin à partir de là. Il y a un extrait de code ici.

Mettre à jour:

Le lien d'origine sur la réponse est en baisse, donc sur la base des commentaires, il s'agit ici du code lié, car personne ne manquerait jamais le code lorsque les liens sont en baisse.

Dans AndroidManifest.xml (partie application):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

Source: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup

Au hasard
la source
Quel fichier est placé ce code: la classe publique BootUpReceiver étend BroadcastReceiver
Jeff Janes
Ça marche, merci! (travaillé sur Android 4.0.4 API niveau 15). Yup .. c'est 2017 et je dois encore développer pour Android 4.0.4 .. :(
Luca
2
Ne fonctionne pas sur Android 8.0! Fonctionne cependant sur Android 4.0.
codezombie
j'utilise le même code mais cela ne fonctionne pas jusqu'à la version kitkat, je veux démarrer l'application lorsque Android tv démarre
Ashutosh Tripathi
@AshutoshTripathi avez-vous résolu ce problème?
ralphgabb
10

De plus, vous pouvez utiliser une application comme AutoStart si vous ne voulez pas modifier le code, pour lancer une application Android au démarrage: AutoStart - Pas de racine

Tony
la source
2

La solution de Sean n'a pas fonctionné pour moi au départ (Android 4.2.2). J'ai dû ajouter une activité fictive au même projet Android et exécuter l'activité manuellement sur l'appareil au moins une fois. Ensuite, la solution de Sean a commencé à fonctionner et le BroadcastReceiver a été averti après les redémarrages ultérieurs.

ole
la source
0

capture d'écran

Je voudrais ajouter un point dans cette question à laquelle je faisais face depuis quelques jours. J'ai essayé toutes les réponses mais celles-ci ne fonctionnaient pas pour moi. Si vous utilisez la version Android 5.1, veuillez modifier ces paramètres.

Si vous utilisez Android version 5.1, vous devez désélectionner (Restreindre au lancement) dans les paramètres de l'application.

paramètres> application> votre application> Restreindre au lancement (désélectionner)

Manish Yadav
la source
3
Je ne pense pas que cela ait jamais été standard. Je n'ai jamais entendu parler de "Restreindre au lancement". Je ne l'ai jamais vu sur différents Samsung, Asus, Sony ... Cela n'a aucun sens pour moi. Il dit que seule l'application est autorisée à démarrer? Qu'est-ce que ça veut dire?
L'incroyable
0

Une autre approche consiste à utiliser android.intent.action.USER_PRESENTplutôt android.intent.action.BOOT_COMPLETEDqu'à éviter les ralentissements pendant le processus de démarrage. Mais ce n'est que truesi l'utilisateur a activé l'écran de verrouillage - sinon cette intention n'est jamais diffusée.

Blog de référence - Le problème de l'intention ACTION_USER_PRESENT d'Android

user2627118
la source
Donc, en d'autres termes, il ne devrait pas être utilisé
behelit