¿Cómo inicio mi aplicación al inicio?

241

Intenté usar el código de muestra en este enlace, pero parece anticuado y no funcionó. Entonces, ¿qué cambios debo hacer y en qué archivos hacer que mi aplicación se inicie automáticamente cuando Android termine de iniciarse?

Poojan
fuente

Respuestas:

315

Primero, necesita el permiso en su AndroidManifest.xml:

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

Además, en su AndroidManifest.xml, defina su servicio y escuche la acción 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>

Luego debe definir el receptor que obtendrá la acción BOOT_COMPLETED e iniciará su servicio.

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);
        }
    }
}

Y ahora su servicio debería estar ejecutándose cuando se inicia el teléfono.

Sean Schulte
fuente
8
Actividades: developer.android.com/guide/topics/fundamentals/activities.html Servicios: developer.android.com/guide/topics/fundamentals/services.html Para iniciar su aplicación cuando el teléfono realmente se inicia, necesitará registre el servicio como se muestra arriba, y luego allí puede usar startActivity () para iniciar su aplicación. Sin embargo, no es una buena idea poner una pantalla frente al usuario si no la solicitó.
Sean Schulte
19
Solo quería agregar que sería mejor usarlo en Intent.ACTION_BOOT_COMPLETEDlugar de codificar la cadena en su receptor. Además, debe usar el nuevo Intent(context, MySystemService.class)constructor al crear la intención.
brianestey
77
¿Hay alguna razón para verificar el tipo de intención si se utiliza el filtro de intención?
Pijusn
1
Por alguna razón me estoy poniendo Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own fileen la public classlínea. ¿Algunas ideas?
pattyd
3
¿Qué es MySystemService?
deportes
120

Así es como hacer que una actividad comience a ejecutarse después de reiniciar el dispositivo Android:

Inserte este código en su AndroidManifest.xmlarchivo, dentro del <application>elemento ( no dentro del <activity>elemento):

<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>

Luego cree una nueva clase yourActivityRunOnStartup(que coincida con la android:nameespecificada para el <receiver>elemento en el manifiesto):

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);
        }
    }

}

Nota: La llamada i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);es importante porque la actividad se inicia desde un contexto externo a la actividad. Sin esto, la actividad no comenzará.

Además, los valores android:enabled, android:exportedy android:permissionen la <receiver>etiqueta no parecen obligatoria. La aplicación recibe el evento sin estos valores. Vea el ejemplo aquí .

thrylos
fuente
Me gusta este "atajo" para evitar tener que hacer un servicio local. ¿Ese código pertenece a la clase que se extiende Application? Tal vez dentro onCreate()?
Alguien en algún lugar
2
parece que ese párrafo de código debería estar dentro onReceive()de unBroadcastReceiver
Alguien en algún lugar
2
Este código debe estar en la actividad, concretamente "yourActivityrRunOnStartup", que amplía la clase BroadcastReceiver y el método onReceive ().
thrylos
2
Traté de dar 10 votos a favor, pero no pude. Perdón y gracias.
Sayka
1
Esto funcionó para mí, pero SOLO si solo tuviera "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" en el filtro de intención. Si usé los otros dos no funcionó.
emhomm4
67

Escuche ACTION_BOOT_COMPLETE y haga lo que necesite desde allí. Hay un fragmento de código aquí.

Actualizar:

El enlace original en la respuesta está inactivo, por lo que, según los comentarios, aquí está el código vinculado, porque nadie extrañará el código cuando los enlaces estén inactivos.

En AndroidManifest.xml (parte de la aplicación):

<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);  
        }

}

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

Al azar
fuente
En qué archivo se encuentra este código: clase pública BootUpReceiver extiende BroadcastReceiver
Jeff Janes
Funciona, gracias! (funcionó en Android 4.0.4 API nivel 15). Sí ... es 2017 y todavía tengo que desarrollar para Android 4.0.4 .. :(
Luca
2
¡No funciona en Android 8.0! Sin embargo, funciona en Android 4.0.
codezombie
Estoy usando el mismo código pero no funciona hasta la versión de kitkat, quiero iniciar la aplicación cuando se inicia Android TV
Ashutosh Tripathi
@AshutoshTripathi, ¿has arreglado esto?
ralphgabb
10

Además, puede usar una aplicación como AutoStart si no desea modificar el código, para iniciar una aplicación de Android al inicio: AutoStart - Sin root

Tony
fuente
2

La solución de Sean no funcionó para mí inicialmente (Android 4.2.2). Tuve que agregar una actividad ficticia al mismo proyecto de Android y ejecutar la actividad manualmente en el dispositivo al menos una vez. Luego, la solución de Sean comenzó a funcionar y el BroadcastReceiver fue notificado después de reinicios posteriores.

viejo
fuente
0

captura de pantalla

Me gustaría agregar un punto en esta pregunta que tuve que enfrentar por un par de días. Intenté todas las respuestas pero no me funcionaban. Si está utilizando la versión 5.1 de Android, cambie esta configuración.

Si está utilizando la versión 5.1 de Android, entonces debe desactivar (Restringir para iniciar) desde la configuración de la aplicación.

configuración> aplicación> su aplicación> Restringir para iniciar (desmarcar)

Manish Yadav
fuente
3
No creo que esto haya sido estándar. Nunca he oído hablar de "Restringir al lanzamiento". Nunca lo vi en diferentes Samsung, Asus, Sony ... No tiene ningún sentido para mí. ¿Dice que solo se permite iniciar la aplicación? ¿Qué significa esto?
El increíble Jan
0

Otro enfoque es usar en android.intent.action.USER_PRESENTlugar de android.intent.action.BOOT_COMPLETEDevitar ralentizaciones durante el proceso de arranque. Pero esto es solotrue si el usuario ha habilitado la pantalla de bloqueo; de lo contrario, esta intención nunca se transmite.

Blog de referencia: el problema con la intención ACTION_USER_PRESENT de Android

usuario2627118
fuente
Por lo tanto, en otras palabras, no debe usarse
Behelit