Cómo iniciar un servicio cuando se instala .apk por primera vez
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>
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 BroadcastReceviers
se 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".
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.
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_COMPLETE
intent 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 .