Recebendo erro Transmissão Intenção Problem
-
19-09-2019 - |
Pergunta
Eu criei um receptor de transmissão na atividade principal e o serviço de fundo que está enviando intenções de transmissão. A aplicação bloqueia cada vez que eu tento executá-lo e as exibe a seguinte mensagem de erro:
10-04 13: 30: 43,218: ERRO / AndroidRuntime (695): java.lang.RuntimeException: Erro receptora transmissão Intenção { = acção com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (Tem extras)} em com.client.gaitlink.GaitLink$LoginStatusReceiver@431690e8
A mensagem de transmissão é enviada de classe CommunicationService no método seguinte:
private void announceLoginStatus(){
Intent intent = new Intent(LOGIN_STATUS_UPDATE);
intent.putExtra(SERVER_MESSAGE, mServerResponseMessage);
intent.putExtra(SESSION_STRING, mSessionString);
sendBroadcast(intent);
}
onde
String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE"
na atividade principal o seguinte reveiver transmissão está definido:
public class LoginStatusReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String serverMessage = intent.getStringExtra(CommunicationService.SERVER_MESSAGE);
String sessionString = intent.getStringExtra(CommunicationService.SESSION_STRING);
userInfo.setSessionString(sessionString);
saveSettings();
}
}
e registrado no método onResume:
IntentFilter loginStatusFilter;
loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE);
loginStatusReceiver = new LoginStatusReceiver();
registerReceiver(loginStatusReceiver, loginStatusFilter);
E o arquivo de manifesto inclui o seguinte:
<activity android:name=".GaitLink"
android:label="@string/app_name">
<intent-filter>
...
<action android:name="com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" />
</intent-filter>
</activity>
Eu realmente aprecio se alguém poderia explicar por que as exibe a mensagem acima e as falhas de aplicação.
Obrigado!
Solução
Você etapa ido a passo no depurador para encontrar exatamente onde ocorre o acidente?
Uma coisa a olhar para fora é se você está substituindo quaisquer eventos de ciclo de vida do Android que você está chamando corretamente o construtor da classe base quando necessário.
Outras dicas
Eu resolvi-lo adicionando intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
quando você iniciar um novo activity
.
Se não for iniciado a partir de um activity
, é necessário intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
.
Você tem dois filtros Intent
; você só precisa de um. Se você registrar o BroadcastReceiver
via registerReceiver()
, utilize apenas o IntentFilter
que é o segundo parâmetro para essa chamada API -. Não também colocar um elemento <intent-filter>
na <activity>
no manifesto
Eu não sei ao certo se esse é o seu problema, mas certamente não ajuda.
Eu não tenho certeza que você pode entender o que eu quero dizer, por causa do meu Inglês.
Eu acho que esta linha de código é causa de um problema:
userInfo.setSessionString(sessionString);
Meu projeto estava errado porque eu quero:
int i = Integer.parseint(intent.getExtars("9"));
e você se registrar duas vezes.
eu acho que você tem que usar o método do ciclo de vida onPause()
e onResume()
Método para cancelar o registro e registrar transmitido intenção.
Descobri que certificando-se a intenção foi executado a partir da atividade original e colocar as coisas em uma classe se livrou de toda a questão.
Esta é uma questão muito antiga, mas eu acho que muitas pessoas ainda estariam procurando respostas para isso. Minha situação é bastante semelhante a este.
O que eu queria fazer, é chamar acabamento () na atividade de criança quando certos eventos ocorrem em atividade pai ou seja, enviando a mensagem de difusão de MainActivity na Atividade Criança.
Segue-se o código no MainActivity quando se ocorreu o evento (por exemplo, quando a ligação de rede é quebrado etc, etc):
Intent intent = new Intent("ACTIVITY_FINISH");
intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken.");
sendBroadcast(intent);
Em função da atividade de criança onResume ():
IntentFilter quitFilter = new IntentFilter();
quitFilter.addAction("ACTIVITY_FINISH");
registerReceiver(m_quitReceiver, quitFilter);
Em função da atividade de criança OnPause ():
unregisterReceiver(m_quitReceiver);
Dentro da classe atividade de criança:
BroadcastReceiver m_quitReceiver = new BroadcastReceiver()
{
public void onReceive(Context context, final Intent intent)
{
if (intent.getAction().equalsIgnoreCase("ACTIVITY_FINISH"))
{
Log.d("INFO", intent.getExtras().getString("FinishMsg"));
finish(); // do here whatever you want
}
}
};
Espero que isso ajude.
Ok que funcionou para mim foi declarar o método onNotification
da seguinte forma:
window.onNotification = function(event) {
alert('onNotification called!');
};