70 votes

Comment démarrer un service lorsque .apk est installé pour la première fois

Dans mon Application, je ne suis pas du tout avoir de l'INTERFACE utilisateur de la partie, donc j'ai besoin de démarrer un Service dès que l'Application est installée sur le Périphérique. J'ai vu beaucoup de liens à partir de laquelle la réponse a été qu'il n'est pas possible, mais je suppose que c'est sûrement possible. Juste un coup d'oeil au PlanB Application sur l'Android Market qui ne répondent à mon besoin. Ci-dessous mon fichier de Manifeste de la façon dont j'ai essayé, mais le Service n'a pas été appelée à tous. Donc, laissez-moi savoir quelle est la meilleure façon de commencer un Service lorsque l'Application est Installée.

Mise à JOUR

J'ai aussi essayé d'utiliser android.intent.action.PACKAGE_ADDED il fonctionne très bien pour la détection de l'emballage pour les autres Applications, mais pas pour lui-même.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.auto.start"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher" >

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

        <receiver android:name=".BootUpReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="android.intent.action.PACKAGE_INSTALL" />
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

80voto

CommonsWare Points 402670

Heureusement, le Plan B ne fonctionne pas sur Android 3.1+, testé sur une XOOM et un Galaxy Nexus.

Ce Plan B n'est exploiter une faille de sécurité qui pourrait être utilisé par le lecteur-par des logiciels malveillants, ce qui est précisément pourquoi Android empêche que cela n'arrive plus.


Mise à JOUR

Pour clarifier les choses: Comme inazaruk posté et je l'ai mis dans les commentaires sur d'autres réponses, toutes les applications, lors de l'installation, sont placés dans un "arrêté" de l'état. C'est le même état que l'application des vents jusqu'à après que l'utilisateur de la force-arrêt de l'application à partir de l'application Paramètres. Alors que dans cette "arrêté" de l'état, l'application ne fonctionnera pas pour une raison quelconque, sauf par un manuel de lancement d'une activité. Notamment, aucune BroadcastReceviers sera invoqué, quel que soit l'événement pour lequel ils ont enregistré, jusqu'à ce que l'utilisateur exécute l'application manuellement.

Ce bloc couvre le Plan B scénario de distance-installer-et-exécuter, dont ils tiraient profit auparavant. Après tout, avec ça, n'importe qui avec un piraté compte Google serait au risque de voir leur appareil infecté, mains-libres.

Ainsi, lorsque l'OP dit:

J'ai besoin de lancer un Service dès que l'Application est installée sur le Périphérique

l'OP sera un échec et aura besoin de la refonte de l'application afin d'éviter cette prétendue "nécessité".

18voto

Jeffrey Blattman Points 8891

les applications installées sur la partition / system ne peuvent pas être placées à l'état "arrêté" après l'installation. si vous avez la racine, vous pouvez le faire,

 $ adb root
$ adb remount
$ adb push your.apk /system/app
 

et il peut immédiatement recevoir des intentions de diffusion. cela ne fournit certainement pas une solution à usage général, mais je voulais le mentionner pour être complet.

14voto

inazaruk Points 37760

Je suis d'accord avec CommonsWare la réponse à la question: Comment faire pour démarrer android service de l'installation. En d'autres termes, vous ne pouvez pas démarrer automatiquement à votre service après que vous avez installé.

Une chose de plus sur les plus récents, les plates-formes Android: si vous n'avez pas d'INTERFACE utilisateur, vous aurez du mal à démarrer votre service, même lors de l'utilisation d' BOOT_COMPLETE d'intention sur Android 3.1+.

C'est parce que toutes les applications installées sont dans l'état arrêté. Dans cet état, les applications ne recevrez pas de diffuser des notifications.

Afin d'activer votre application à une autre application (ou l'utilisateur) a besoin pour démarrer votre activité ou le service, ou de fournisseur de contenu. Le flux de travail habituel est lorsque l'utilisateur clique sur votre icône d'application.

J'ai écrit des explications détaillées à ce sujet dans mon blog.

5voto

Malcolm Points 14261

Plan B effectue ce lancement en écoutant les événements qui se produisent dans le système. Il utilise un récepteur qui écoute littéralement des centaines d'événements en espérant que certains d'entre eux se déclencheront. Voilà comment vous pouvez le faire. Sinon, il n'y a pas de moyen intégré pour lancer l'application dès son installation.

4voto

user370305 Points 46287

Je ne pense pas que de sorte que Vous pouvez commencer immédiatement après l'installation de votre application sur l'appareil,

La demande doit d'abord être invoquée par l'utilisateur à travers une sorte d' Activity.Les seules choses que vous devez vous inscrire en quelques Broadcast Receiver appropriés intentions dans le manifeste qui t'invoquent service quand quelque chose se passe sur l'appareil, mais ce remaing pour Android version 3.1.

EDIT:

Après Android 3.1+ , vous ne pouvez pas utiliser Broadcast pour le démarrage de votre application, parce que tout reste en état inactif après l'achèvement du dispositif de démarrage et le lancement de l'application à l'utilisateur d'avoir à s'en prévaloir.(En touchant l'icône de l'application).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X