web-dev-qa-db-fra.com

Comment démarrer mon application au démarrage?

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

206
Poojan

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 votreAndroidManifest.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 destinataire qui obtiendra l'action BOOT_COMPLETED et démarrera 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 être lancé au démarrage du téléphone.

289
Sean Schulte

Voici comment faire en sorte qu'une activité commence à s'exécuter après le redémarrage du périphérique Android:

Insérez ce code dans votre fichier AndroidManifest.xml, dans l'élément <application> (not dans l'élément <activity>):

<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 au Android:name spécifié pour l'élément <receiver> 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 commencera pas.

De plus, les valeurs Android:enabled, Android:exported et Android:permission dans la balise <receiver> ne semblent pas obligatoires. L'application reçoit l'événement sans ces valeurs. Voir l'exemple ici .

101
thrylos

Écoutez les (ACTION_BOOT_COMPLETE } et faites ce que vous devez à partir de là. Il y a un extrait de code ici.

Mettre à jour:

Le lien original sur la réponse est en panne, donc, basé sur les commentaires, il s'agit ici d'un code lié, car personne ne manquerait jamais le code lorsque les liens sont en panne.

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 }

54
Haphazard

De plus, vous pouvez utiliser une application comme AutoStart si vous ne souhaitez pas modifier le code, pour lancer une application Android au démarrage: AutoStart - No root

10
Tony

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

2
ole

Une autre approche consiste à utiliser Android.intent.action.USER_PRESENT au lieu de Android.intent.action.BOOT_COMPLETED pour éviter les ralentissements pendant le processus de démarrage. Mais ceci n’est que true si l’utilisateur a activé le verrouillage de l’écran - sinon cette intention n’est jamais diffusée.

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

0
user2627118

screenshot

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

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

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

0
Manish Yadav