Come posso avviare la mia app all'avvio?


241

Ho provato a utilizzare il codice di esempio in questo link ma sembra obsoleto e non ha funzionato. Quindi quali modifiche devo apportare e su quali file per avviare automaticamente la mia app al termine dell'avvio di Android?

Risposte:


315

Innanzitutto, hai bisogno dell'autorizzazione nel tuo AndroidManifest.xml:

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

Inoltre, nel tuo AndroidManifest.xml, definisci il tuo servizio e ascolta l' azione 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>

Quindi è necessario definire il destinatario che otterrà l' azione BOOT_COMPLETED e avvierà il servizio.

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

E ora il servizio dovrebbe essere in esecuzione all'avvio del telefono.


8
Attività: developer.android.com/guide/topics/fundamentals/activities.html Servizi: developer.android.com/guide/topics/fundamentals/services.html Per avviare l'applicazione all'avvio effettivo del telefono, è necessario registra il servizio come mostrato sopra, quindi puoi usare startActivity () per avviare la tua app. Tuttavia, non è una buona idea mettere uno schermo di fronte all'utente se non lo chiedono.
Sean Schulte,

19
Volevo solo aggiungere che sarebbe meglio usare Intent.ACTION_BOOT_COMPLETEDinvece di codificare la stringa nel ricevitore. Inoltre, dovrebbe utilizzare il nuovo Intent(context, MySystemService.class)costruttore durante la creazione dell'intento.
Brianestey,

7
C'è un motivo per verificare il tipo di intento se si utilizza intent-filter?
Pijusn,

1
Per qualche ragione mi metto Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filein public classlinea. Qualche idea?
Pattyd

3
Che cos'è MySystemService?
sport

120

Ecco come avviare un'attività in esecuzione dopo il riavvio del dispositivo Android:

Inserisci questo codice nel tuo AndroidManifest.xmlfile, all'interno <application>dell'elemento ( non all'interno <activity>dell'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>

Quindi creare una nuova classe yourActivityRunOnStartup(corrispondente a quella android:namespecificata per l' <receiver>elemento nel manifest):

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 chiamata i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);è importante perché l'attività viene avviata da un contesto esterno all'attività. Senza questo, l'attività non inizierà.

Inoltre, i valori android:enabled, android:exportede android:permissionnel <receiver>tag non sembrano obbligatorie. L'app riceve l'evento senza questi valori. Vedi l'esempio qui .


Mi piace questa "scorciatoia" per evitare di dover effettuare un servizio locale. Quel codice appartiene alla classe che si estende Application? Forse dentro onCreate()?
Someone Somewhere

2
sembra che quel paragrafo di codice dovrebbe essere all'interno onReceive()di unBroadcastReceiver
Someone Somewhere

2
Questo codice dovrebbe trovarsi nell'attività, in particolare "yourActivityrRunOnStartup" che estende la classe BroadcastReceiver e il metodo onReceive ().
thrylos,

2
Ho provato a dare un 10 voti ma non ci sono riuscito. Scusa e grazie.
Sayka,

1
Questo ha funzionato per me, ma SOLO se avessi solo "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" nel filtro degli intenti. Se avessi usato gli altri due non avrebbe funzionato.
emhomm4,

67

Ascolta ACTION_BOOT_COMPLETE e fai quello che ti serve da lì. C'è uno snippet di codice qui.

Aggiornare:

Il link originale sulla risposta è inattivo, quindi in base ai commenti, qui è un codice collegato, perché nessuno perderebbe mai il codice quando i collegamenti sono inattivi.

In AndroidManifest.xml (parte dell'applicazione):

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

}

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


Quale file viene inserito questo codice: la classe pubblica BootUpReceiver estende BroadcastReceiver
Jeff Janes

Funziona, grazie! (ha funzionato su Android 4.0.4 API level 15). Sì .. è il 2017 e devo ancora sviluppare per Android 4.0.4 .. :(
Luca

2
Non funziona su Android 8.0! Funziona su Android 4.0 però.
codezombie,

sto usando lo stesso codice ma non funziona fino alla versione kitkat, voglio avviare l'applicazione all'avvio di Android TV
Ashutosh Tripathi,

@AshutoshTripathi hai risolto questo problema?
ralphgabb,

10

Inoltre, puoi utilizzare un'app come AutoStart se non vuoi modificare il codice, per avviare un'applicazione Android all'avvio: AutoStart - No root


2

La soluzione di Sean inizialmente non ha funzionato per me (Android 4.2.2). Ho dovuto aggiungere un'attività fittizia allo stesso progetto Android ed eseguire l'attività manualmente sul dispositivo almeno una volta. Quindi la soluzione di Sean ha iniziato a funzionare e BroadcastReceiver è stato avvisato dopo i successivi riavvii.


0

immagine dello schermo

Vorrei aggiungere un punto a questa domanda che ho dovuto affrontare per un paio di giorni. Ho provato tutte le risposte ma quelle non funzionavano per me. Se si utilizza Android versione 5.1, modificare queste impostazioni.

Se si utilizza Android versione 5.1, è necessario deselezionare (Limita l'avvio) dalle impostazioni dell'app.

impostazioni> app> l'app> Limita l'avvio (deseleziona)


3
Non penso che questo sia mai stato standard. Non ho mai sentito parlare di "Limitare il lancio". Non l'ho mai visto su diversi Samsung, Asus, Sony ... Per me non ha alcun senso. Dice che è consentita solo l'avvio dell'app? Cosa significa questo?
L'incredibile

0

Un altro approccio è utilizzare android.intent.action.USER_PRESENTinvece di android.intent.action.BOOT_COMPLETEDevitare rallentamenti durante il processo di avvio. Ma questo è solo truese l'utente ha abilitato la schermata di blocco, altrimenti questo intento non viene mai trasmesso.

Blog di riferimento - Il problema con l'intento ACTION_USER_PRESENT di Android


Quindi, in altre parole, non dovrebbe essere usato
behelit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.