Razões pelas quais o Intent aprovado seria NULL em onStartCommand

100

Existe algum outro motivo para que o Intent passado onStartCommand(Intent, int, int)seja NULL, além de o sistema reiniciar o serviço por meio de um sinalizador como START_STICKY?

Além disso, quando o serviço é reiniciado pelo sistema, o Intent.getAction()método retorna NULL ... às vezes. Intent não é NULL, apenasgetAction()

Eu perguntei aqui também, mas ainda não recebi uma resposta.

ATUALIZAÇÃO : depois de conversar com Mark Murphy, ele sugeriu que eu retornasse START_REDELIVER_INTENTno onStartCommand()retorno de chamada em meu serviço em vez de START_STICKYpara que todo o intent fosse enviado após uma reinicialização.

Não fiz isso inicialmente porque estava preocupado com o fato de que, se o serviço estava tentando fazer algo, no meio de algo o serviço foi reiniciado ... ele reconhecerá que começou a fazer isso? Acho que é lógico que terei de ser responsável :)

rf43
fonte
16
Em vez de editar sua pergunta com a resposta, adicione uma resposta e aceite-a para que sua pergunta deixe de aparecer no conjunto de perguntas não respondidas - obrigado.
Dale Wilson
2
Apenas uma nota para alguém com problema semelhante. Descobri que geralmente quando recebo um erro que intentestá nullligado onStartCommand(), é causado por algum outro erro que era visível no LogCat antes disso. Não sei por quê, mas foi o que observei e é muito fácil passar por alto.
Piotr Chojnacki
2
@DaleWilson eu faria, mas esta questão não está realmente resolvida. Até que eu receba uma resposta definitiva sobre por que um Intent é nulo ou como evitar um intent nulo sem recorrer ao uso de START_REDELIVER_INTENT (que, eu aprendi mais tarde, não é o que eu precisava, mas ainda resolverá os problemas de algumas pessoas, portanto, deixei minha edição) Não posso aceitar uma resposta.
rf43
@Mosquito Por acaso você percebeu o que, especificamente, estava gerando um erro?
rf43
1
@DDoSAttack Realmente não importa. No meu caso, foi por exemplo NullPointerExceptionem algum lugar em uma das Atividades. Mais tarde, foi algum outro erro. Mas em ambos os casos, meu rastreamento de pilha mostrou que meu serviço - que estava em execução enquanto esse erro ocorreu - intentera nullcomo no seu caso. Eu estive pensando por um longo tempo o que há de errado, quando decidi rolar o rastreamento da pilha e parecia que em algum lugar no topo eu tinha meu verdadeiro erro. Depois de resolver este, também aquele com null intentdesapareceu.
Piotr Chojnacki

Respostas:

50

Estou surpreso que não haja discussão sobre as bandeiras de entrada. Vou monitorar isso nos registros com o seguinte:

if (null == intent || null == intent.getAction ()) {
        String source = null == intent ? "intent" : "action";
        Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
        return START_STICKY;
}

Atualização: os sinalizadores eram 0, então não havia nada acionável lá. Deixei o cheque nulo sem perda de função.

Edit: Ok, encontrei na documentação do START_STICKY de todos os lugares! "se não houver nenhum comando de início pendente a ser entregue ao serviço, ele será chamado com um objeto de intenção nulo, portanto, você deve ter cuidado para verificar isso."

http://developer.android.com/reference/android/app/Service.html

Eric Woodruff
fonte
6
em kotlin, o intent é marcado como não nulo e trava o aplicativooverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi,
@MuhammadNaderi você pode simplesmente fazer a intenção Intent?. Funcionou para mim. Mas então, é claro, você precisa lidar corretamente com a intenção nula.
Patrick Boos
@PatrickBoos But then of course you need to correctly handle null intent; O que você quer dizer?! Quão? Obrigado.
Dr.jacky
Eu quis dizer apenas no seu código que onStartCommand(intent: Intent?, ...)ele deve funcionar. E então não faça, intent!!mas verifique corretamente se a intenção é nula.
Patrick Boos