Estou tentando iniciar um serviço quando um dispositivo é inicializado no Android, mas não consigo fazê-lo funcionar. Eu olhei para vários links online, mas nenhum código funciona. Estou esquecendo alguma coisa?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
Receptor de radiodifusão
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Respostas:
As outras respostas parecem boas, mas pensei em agrupar tudo em uma resposta completa.
Você precisa do seguinte em seu
AndroidManifest.xml
arquivo:No seu
<manifest>
elemento:No seu
<application>
elemento (certifique-se de usar um nome de classe totalmente qualificado [ou relativo] para o seuBroadcastReceiver
):(você não precisa o
android:enabled
,exported
etc., atributos: os padrões do Android estão corretas)Em
MyBroadcastReceiver.java
:Da pergunta original:
<receiver>
elemento estava no<application>
elementoBroadcastReceiver
foi especificado<intent-filter>
fonte
Como informações adicionais: BOOT_COMPLETE é enviado aos aplicativos antes da montagem do armazenamento externo. Portanto, se o aplicativo estiver instalado no armazenamento externo, ele não receberá a mensagem de difusão BOOT_COMPLETE.
Mais detalhes aqui na seção Receptores de transmissão que ouvem "inicialização concluída"
fonte
Como iniciar o serviço na inicialização do dispositivo (aplicativo de execução automática, etc.)
Primeiro: desde a versão Android 3.1+, você não recebe o BOOT_COMPLETE se o usuário nunca iniciou o aplicativo pelo menos uma vez ou se o aplicativo "força o fechamento". Isso foi feito para impedir que o malware registrasse automaticamente o serviço. Essa falha de segurança foi fechada nas versões mais recentes do Android.
Solução:
Crie aplicativo com atividade. Quando o usuário o executa, uma vez que o aplicativo pode receber a mensagem de transmissão BOOT_COMPLETE.
Por segundo: BOOT_COMPLETE é enviado antes da montagem do armazenamento externo. Se o aplicativo estiver instalado no armazenamento externo, ele não receberá a mensagem de difusão BOOT_COMPLETE.
Nesse caso, há duas soluções:
Se seu aplicativo já estiver instalado no armazenamento interno, o código abaixo pode ajudá-lo a entender como iniciar o serviço na inicialização do dispositivo.
Em Manifest.xml
Permissão:
Registre seu receptor BOOT_COMPLETED:
Registre seu serviço:
No receptor OnBoot.java:
Para a HTC, talvez você também precise adicionar no manifesto esse código se o dispositivo não capturar RECEIVE_BOOT_COMPLETED:
O receptor agora fica assim:
Como testar o BOOT_COMPLETED sem reiniciar o emulador ou dispositivo real? É fácil. Tente o seguinte:
Como obter o ID do dispositivo? Obtenha a lista de dispositivos conectados com IDs:
adb no ADT, por padrão, você pode encontrar em:
Aproveitar! )
fonte
Junto com
também use,
Os dispositivos HTC parecem não pegar BOOT_COMPLETED
fonte
android.intent.action.QUICKBOOT_POWERON
é enviado apenas ao restaurar a partir da inicialização rápida. Isso significa que não é necessário executar ações como redefinir alarmes ao se recuperar do Fast Boot à medida que eles são preservados. Portanto, só seria necessário usar<action android:name="android.intent.action.QUICKBOOT_POWERON" />
se você quiser fazer algo quando o usuário achar que o dispositivo foi inicializado.Observe que, no início da pergunta, há um erro de digitação:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
ao invés de :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
um pequeno "_" e todo esse problema :)
fonte
Eu descobri agora que isso pode ser por causa da
Fast Boot
opção emSettings
>Power
Quando essa opção está desativada, meu aplicativo recebe uma transmissão desta, mas não o contrário.
By the way, eu tenho
Android 2.3.3
emHTC Incredible S
.Espero que ajude.
fonte
Eu acho que seu manifesto precisa adicionar:
fonte
Depois de tentar todas as respostas e truques mencionados, finalmente descubro por que o código não está funcionando no meu telefone. Alguns telefones Android como "Huawei Honor 3C Android 4.2.2 " têm um menu do Statup Manager em suas configurações e seu aplicativo deve ser verificado na lista. :)
fonte
Eu tenho uma
<category>
marca adicional , não sei se isso faz alguma diferença.Você já tentou omitir a cláusula if
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, pois o receptor provavelmente só recebe essa intenção de qualquer maneira?fonte
Consulte este link http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Procedimento passo a passo para usar a inicialização no serviço
fonte
Antes de montar o armazenamento externo, o BOOT_COMPLETE é enviado, execute. Se o aplicativo estiver instalado no armazenamento externo, ele não receberá a mensagem de difusão do BOOT_COMPLETE. Para evitar isso, você pode instalar seu aplicativo no armazenamento interno. você pode fazer isso apenas adicionando esta linha no menifest.xml
Alguns dispositivos HTC podem ativar um recurso de "inicialização rápida" que é mais como uma hibernação profunda e não uma reinicialização real e, portanto, não deve dar a intenção BOOT_COMPLETE. Para recuperar isso, você pode adicionar este filtro de intenção dentro do seu receptor:
fonte
Foi o que eu fiz
1. Eu fiz a classe Receiver
2.no manifesto
3.e depois de TUDO que você precisa "configurar" o receptor em sua MainActivity, ele pode estar dentro do onCreate
o último salto que aprendi com o ApiDemos
fonte
Se você estiver usando o Android Studio e gosta muito do preenchimento automático, devo informá-lo, estou usando o Android Studio v 1.1.0 e usei o preenchimento automático para a seguinte permissão
E o Android Studio completou automaticamente
RECEIVE_BOOT_COMPLETED
tudo em letras minúsculasreceive_boot_completed
e eu continuei puxando meu cabelo porque já tinha marcado minha lista de verificação para saber o que fazer para iniciar o serviço na inicialização. Acabei de confirmar novamentefonte
Como o @Damian comentou, todas as respostas neste tópico estão fazendo errado. Se você fizer isso manualmente, corre o risco de o Serviço ser parado no meio do dispositivo que entra no modo de suspensão. Você precisa obter um bloqueio de ativação primeiro. Felizmente, a biblioteca de suporte nos fornece uma classe para fazer isso:
em seu serviço, certifique-se de liberar o bloqueio de ativação:
Não se esqueça de adicionar a permissão WAKE_LOCK ao seu festival principal:
fonte
onNewIntent()
? Ou você pode olhar para a fonte para IntentService e ver o que você precisa fazer para o seu serviço para torná-lo coincidir com ...De fato, eu entrei nesse problema há pouco tempo e é realmente muito fácil de corrigir, você realmente não faz nada errado se configurar a
"android.intent.action.BOOT_COMPLETED"
permissão e o filtro de intenção.Lembre-se de que, no Android 4.X, é necessário executar o ouvinte de transmissão antes de iniciar o serviço na inicialização, ou seja, você deve adicionar uma atividade primeiro. Depois que o receptor de transmissão estiver em execução, seu aplicativo funcionará conforme o esperado, No entanto, no Android 4.X, não encontrei uma maneira de iniciar o serviço na inicialização sem nenhuma atividade; acho que o Google fez isso por razões de segurança.
fonte
Eu enfrentei esse problema se eu deixar o construtor vazio na classe do receptor. Após a remoção, o contsructor vazio noRreceive methos começou a funcionar bem.
fonte