2009-10-04 3 views
14

브로드 캐스트 인 텐트를 보내는 주 활동 및 백그라운드 서비스에 브로드 캐스트 리시버를 만들었습니다. 이 응용 프로그램은 내가 그것을 실행하려고 할 때마다 충돌 및 로그 다음과 같은 오류 메시지가 표시브로드 캐스트 인 텐트 수신 중 오류가 발생했습니다.

10-04 13 : 30 : 43.218 : ERROR/AndroidRuntime (695) : java.lang.RuntimeException가이 오류를 방송 수신 텐트 { 조치 = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (엑스트라를 가짐)}에 [email protected]

방송 메시지에서 전송 다음 메소드의 CommunicationService 클래스

private void announceLoginStatus(){ 
    Intent intent = new Intent(LOGIN_STATUS_UPDATE); 
    intent.putExtra(SERVER_MESSAGE, mServerResponseMessage); 
    intent.putExtra(SESSION_STRING, mSessionString); 
    sendBroadcast(intent); 
} 

여기서 다음 방송 reveiver 정의되는 주요 활동

String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" 

:

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

및 onResume 방법에 등록 :

 IntentFilter loginStatusFilter; 
     loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE); 
     loginStatusReceiver = new LoginStatusReceiver(); 
     registerReceiver(loginStatusReceiver, loginStatusFilter); 

매니페스트 파일 나는

Log가 위의 메시지를 표시하고 응용 프로그램이 충돌하는 이유를 설명 할 수 있다면 정말 감사하겠습니다.

감사합니다.

답변

5

디버거에서 단계별로 단계별로 충돌이 발생 했습니까?

필요한 경우 기본 클래스의 생성자를 올바르게 호출하고있는 Android 라이프 사이클 이벤트를 재정의하는 경우를 고려해야합니다.

+58

문제가 무엇인지 알려주시겠습니까? – Buffalo

4

Intent 개의 필터가 있습니다. 당신은 오직 하나만 필요합니다. registerReceiver()을 통해 BroadcastReceiver을 등록하는 경우 해당 API 호출의 두 번째 매개 변수 인 IntentFilter 만 사용하십시오. <intent-filter> 요소를 매니페스트의 <activity>에도 넣지 마십시오.

그게 문제인지 확실하지 않지만 확실히 도움이되지 않습니다.

7

새로운 활동을 시작할 때 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);을 추가하여 해결했습니다.

활동으로 시작하지 않은 경우 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK"이 필요합니다.

+0

그것은 나를 위해 작동합니다! –

0

나는 라이프 사이클 방법 onPause()onResume() 브로드 캐스트 인 텐트 등록을 취소하고 등록하는 방법을 사용해야한다고 생각합니다.

0

나는 내 영어 때문에 내가하고 싶은 말을 이해할 수 있을지 확신하지 못한다.

int i = Integer.parseint(intent.getExtars("9")); 

을하고 두 번 등록 : 내가 원하는 때문에

userInfo.setSessionString(sessionString); 

내 프로젝트가 잘못 :

나는 코드 줄이 문제의 원인이라고 생각합니다.

0

의도가 원래 활동에서 실행되었는지 확인하고 모든 것을 한 클래스에 넣으면 전체 문제점이 제거됩니다.

window.onNotification = function(event) { 
    alert('onNotification called!'); 
}; 
-1

. 내 상황은이 상황과 아주 비슷하다.

내가 원했던 것은 부모 작업에서 특정 이벤트가 발생했을 때, 즉 MainActivity에서 Child Activity로 브로드 캐스트 메시지를 보내면 자식 작업에서 finish()를 호출하는 것입니다.

이 다음은 이벤트가 발생한다 MainActivity 코드 (예를 들어, 네트워크 연결이 깨진 경우 등 등)입니다 : 자식 활동의 OnResume에서

Intent intent = new Intent("ACTIVITY_FINISH"); 
    intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken."); 
    sendBroadcast(intent); 

() 함수 :

IntentFilter quitFilter = new IntentFilter(); 
    quitFilter.addAction("ACTIVITY_FINISH"); 
    registerReceiver(m_quitReceiver, quitFilter); 

에서 자식 활동의 OnPause() 함수는 다음과 같습니다.

unregisterReceiver(m_quitReceiver); 

하위 작업 내 엉덩이 :

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

희망이 있습니다.

0

이것은 아주 오래된 질문이지만, 나는 많은 사람들은 여전히 ​​그것에 대한 답변을 검색 할 것이라고 생각 다음과 같이 나를 onNotification 방법을 선언했다 일한 것을 좋아

관련 문제