Cómo iniciar un servicio cuando se instala .apk por primera vez

Resuelto Lalit Poptani asked hace 54 años • 11 respuestas

En mi Aplicación no tengo ninguna parte de la interfaz de usuario, por lo que necesito iniciar un Servicio tan pronto como la Aplicación se instale en el Dispositivo. Vi muchos enlaces en los que la respuesta fue que no es posible, pero supongo que seguramente sí es posible. Sólo eche un vistazo a la aplicación PlanB en el Android Market que cumple con mis requisitos. A continuación se muestra mi archivo de Manifiesto sobre cómo lo intenté, pero no se llamó al Servicio en absoluto. Entonces, déjeme saber cuál es la mejor manera posible de iniciar un Servicio cuando se instala la Aplicación.

ACTUALIZAR

También intenté usarlo android.intent.action.PACKAGE_ADDED. Funciona bien para detectar el paquete para otras aplicaciones, pero no para sí mismo.

<?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>
Lalit Poptani avatar Jan 01 '70 08:01 Lalit Poptani
Aceptado

Afortunadamente, Plan B no funciona en Android 3.1+, como se probó en un XOOM y un Galaxy Nexus.

Lo que hace el Plan B es explotar un agujero de seguridad que podría ser aprovechado por malware no autorizado, razón por la cual Android evita que esto vuelva a suceder.


ACTUALIZAR

Para aclarar: como publicó Inazaruk y puse comentarios sobre otras respuestas, todas las aplicaciones, tras la instalación, se colocan en un estado "detenido". Este es el mismo estado en el que termina la aplicación después de que el usuario la detiene por la fuerza desde la aplicación Configuración. Mientras esté en este estado "detenido", la aplicación no se ejecutará por ningún motivo, excepto mediante el inicio manual de una actividad. En particular, no BroadcastReceviersse invocará, independientemente del evento para el que se haya registrado, hasta que el usuario ejecute la aplicación manualmente.

Este bloque cubre el escenario del Plan B de instalación y ejecución remota, que estaban aprovechando anteriormente. Después de todo, con eso, cualquier persona con una cuenta de Google pirateada correría el riesgo de que su dispositivo se infecte, por así decirlo, con manos libres.

Entonces, cuando el OP dice:

Necesito iniciar un Servicio tan pronto como la Aplicación se instale en el Dispositivo

el OP no tendrá éxito y deberá rediseñar la aplicación para evitar esta supuesta "necesidad".

CommonsWare avatar Dec 16 '2011 13:12 CommonsWare

Las aplicaciones instaladas en la partición /system no están sujetas a ser colocadas en estado "detenidas" después de la instalación. Si tienes root, puedes hacerlo,

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

Y puede recibir inmediatamente intenciones de transmisión. Ciertamente, esto no proporciona una solución de propósito general, pero quería mencionarla para que esté completa.

EDITAR: tenga en cuenta que las diferentes versiones de Android ubican los APK del sistema en diferentes lugares. Por ejemplo, Android 8 los coloca en /system/app//.apk. Insértelo en su dispositivo, husmee y siga el mismo esquema utilizado para otros APK del sistema.

Jeffrey Blattman avatar Jan 06 '2012 20:01 Jeffrey Blattman

Estoy de acuerdo con la respuesta de CommonsWare a la pregunta: Cómo iniciar el servicio de Android durante la instalación . En otras palabras, no puede iniciar automáticamente su servicio después de haberlo instalado.

Una cosa más acerca de las plataformas Android más nuevas: si no tiene ninguna interfaz de usuario, tendrá problemas para iniciar su servicio incluso cuando use BOOT_COMPLETEintent en Android 3.1+.

Esto se debe a que todas las aplicaciones instaladas están detenidas. En este estado, las aplicaciones no recibirán NINGUNA notificación de transmisión.

Para activar su aplicación, alguna otra aplicación (o usuario) necesita iniciar su servicio o actividad, o proveedor de contenido. El flujo de trabajo habitual es cuando el usuario hace clic en el icono de su aplicación.

He escrito explicaciones detalladas sobre esto en la publicación de mi blog .

inazaruk avatar Dec 16 '2011 10:12 inazaruk