Como inicio meu aplicativo na inicialização?

241

Tentei usar o código de exemplo neste link, mas parece desatualizado e não funcionou. Então, quais alterações eu tenho que fazer e quais arquivos o meu aplicativo inicia automaticamente quando o Android termina a inicialização?

Poojan
fonte

Respostas:

315

Primeiro, você precisa da permissão no seu AndroidManifest.xml:

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

Além disso, AndroidManifest.xmldefina seu serviço e ouça a ação 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>

Em seguida, você precisa definir o receptor que obterá a ação BOOT_COMPLETED e iniciará o serviço.

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 agora seu serviço deve estar em execução quando o telefone iniciar.

Sean Schulte
fonte
8
Atividades: developer.android.com/guide/topics/fundamentals/activities.html Serviços: developer.android.com/guide/topics/fundamentals/services.html Para iniciar seu aplicativo quando o telefone for inicializado, você precisará registre o serviço como mostrado acima e, em seguida, você poderá usar startActivity () para iniciar seu aplicativo. No entanto, não é uma boa ideia colocar uma tela na frente do usuário, se ele não pedir.
21811 Sean Schulte
19
Só queria acrescentar que seria melhor usar, em Intent.ACTION_BOOT_COMPLETEDvez de codificar a string no seu receptor. Além disso, deve usar o novo Intent(context, MySystemService.class)construtor ao criar o Intent.
Brianestey
7
Existe uma razão para verificar o tipo de intenção se o filtro de intenção for usado?
Pijusn
1
Por alguma razão, estou entrando Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filena public classlinha. Alguma ideia?
Pattyd
3
O que é o MySystemService?
sports
120

É assim que uma atividade começa a ser executada após a reinicialização do dispositivo Android:

Insira este código no seu AndroidManifest.xmlarquivo, dentro do <application>elemento ( não dentro do <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>

Em seguida, crie uma nova classe yourActivityRunOnStartup(correspondendo à android:nameespecificada para o <receiver>elemento no manifesto):

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: A chamada i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);é importante porque a atividade é iniciada a partir de um contexto fora da atividade. Sem isso, a atividade não será iniciada.

Além disso, os valores android:enabled,android:exported e android:permissionna <receiver>tag não parecem obrigatório. O aplicativo recebe o evento sem esses valores. Veja o exemplo aqui .

thrylos
fonte
Eu gosto desse "atalho" para evitar a necessidade de fazer um serviço local. Esse código pertence à classe que se estende Application? Talvez dentro onCreate()?
Alguém em algum lugar
2
parece que esse parágrafo do código deve estar dentro onReceive()de umBroadcastReceiver
Alguém em algum lugar
2
Este código deve estar na atividade "yourActivityrRunOnStartup", que estende a classe BroadcastReceiver e o método onReceive ().
Thrylos # 6/14
2
Eu tentei dar 10 votos positivos, mas não consegui. Desculpe e obrigado.
Sayka
1
Isso funcionou para mim, mas SOMENTE se eu tivesse apenas "<ação android: nome =" android.intent.action.BOOT_COMPLETED "/>" no filtro de intenção. Se eu usasse os outros dois, não funcionaria.
emhomm4
67

Ouça o ACTION_BOOT_COMPLETE e faça o que você precisa a partir daí. Há um trecho de código aqui.

Atualizar:

O link original na resposta está inoperante; portanto, com base nos comentários, aqui está o código vinculado, porque ninguém perderia o código quando os links estiverem inativos.

No AndroidManifest.xml (parte do aplicativo):

<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

Haphazard
fonte
Qual arquivo esse código foi colocado: public class BootUpReceiver estende BroadcastReceiver
Jeff Janes
Funciona, obrigado! (trabalhou no Android 4.0.4 API nível 15). Sim .. é 2017 e ainda tenho que desenvolver para o Android 4.0.4 .. :(
Luca
2
Não funciona no Android 8.0! Funciona no Android 4.0.
Codezombie 22/10
Eu estou usando mesmo código, mas não o seu trabalho até a versão KitKat, eu quero começar aplicação quando android tv início
Ashutosh Tripathi
@AshutoshTripathi você resolveu isso?
ralphgabb
10

Além disso, você pode usar um aplicativo como o AutoStart se não quiser modificar o código, para iniciar um aplicativo Android na inicialização: AutoStart - No root

Tony
fonte
2

A solução do Sean não funcionou para mim inicialmente (Android 4.2.2). Eu tive que adicionar uma atividade fictícia ao mesmo projeto Android e executá-la manualmente no dispositivo pelo menos uma vez. Em seguida, a solução do Sean começou a funcionar e o BroadcastReceiver foi notificado após as reinicializações subsequentes.

ole
fonte
0

captura de tela

Eu gostaria de acrescentar um ponto nesta questão que eu estava enfrentando por alguns dias. Eu tentei todas as respostas, mas essas não estavam funcionando para mim. Se você estiver usando a versão Android 5.1, altere essas configurações.

Se você estiver usando a versão Android 5.1, precisará desmarcar (Restringir para iniciar) das configurações do aplicativo.

configurações> aplicativo> seu aplicativo> Restringir para iniciar (desmarcar)

Manish Yadav
fonte
3
Eu não acho que isso já foi padrão. Eu nunca ouvi falar de "Restringir a lançar". Nunca vi isso em diferentes Samsung, Asus, Sony ... Não faz sentido para mim. Ele diz que o aplicativo só tem permissão para iniciar? O que isto significa?
A incrível Jan
0

Outra abordagem é usar em android.intent.action.USER_PRESENTvez de android.intent.action.BOOT_COMPLETEDevitar lentidão durante o processo de inicialização. Mas isso é apenas truese o usuário tiver ativado a tela de bloqueio - caso contrário, essa intenção nunca será transmitida.

Blog de referência - O problema com a intenção ACTION_USER_PRESENT do Android

user2627118
fonte
Então, em outras palavras, ele não deve ser usado
behelit