2011-02-12 2 views
19

"수신기는 등록되지" Android 개발자 콘솔 (2 개의 보고서 만 있고 내 앱에는 수천 명의 사용자가 있음)의 보고서 예외는 unregisterReceiver()에 의해 트리거됩니다. 무슨 일이 일어날 수 있습니까? try-catch로 둘러싼다고 확신하지 않습니다.이상한 onResume() 내가 예외

+0

어떤 API 버전에서 발생합니까? –

+0

모르겠다. 나는 오류 보고서에서 그것을 볼 수 없다. – fhucho

+0

일부 휴대폰에서는'onResume' 이벤트가'onCreate' 이후에 항상 호출되는 것은 아니며,이 활동에 대한 첫 번째'onPause'에서 문제를 일으킨다 고 생각합니다. – Xion

답변

19

우리는이 오류를 본 적이 특정 화면을 표시 한 다음 두 방향 변경 (예 : 장치를 거꾸로 뒤집기)을 즉시 수행합니다. unregisterReceiver에 대한

이 API의 문서는 말한다 :

등록 취소 이전에 등록 된 브로드 캐스트 리시버는.

명시 적으로 말하지는 않았지만, 본 적이 있듯이 IllegalArgumentException: Receiver not registered이 아직 등록되지 않았다면 맞았습니다.

나는 Receiver를 멤버 필드로 저장하고 등록되지 않은 경우 null로 설정합니다. 즉, null로 초기화 한 다음 등록 할 때만 설정합니다. 이것은 완벽하지 않을 수도 있지만 내 충돌을 해결합니다! 에서

private Receiver mReceiver = null; 

내 onServiceConnected :에서

sLog.debug("Registering receiver"); 
mReceiver = new Receiver(); 
registerReceiver(mReceiver, filter); 

을 내 onServiceDisconnected :

BroadcastReceiveronCreate() 수명주기 방법에 등록해야
if (mReceiver == null) 
{ 
    sLog.info("Do not unregister receiver as it was never registered"); 
} 
else 
{ 
    sLog.debug("Unregister receiver"); 
    unregisterReceiver(mReceiver); 
    mReceiver = null; 
} 
2

예를 들어 수신기가 실제로 전에 등록되지 않은 상태가있을 수 있습니다. 사용자가 앱을 종료합니다.

등록 해제를 실행하기 전에 수신기에 대한 검사를 추가하려고 할 수 있습니다은, (나는 몇몇 경우에 이런 짓을 한) 하십시오에 긴 눌러를 할 때

protected void onPause() { 
    if(timeTickReceiver != null) { 
    unregisterReceiver(timeTickReceiver); 
    } 
} 
0

:

private BroadcastReceiver receiver; 

@Overrride 
public void onCreate(Bundle savedInstanceState){ 
    IntentFilter filter = new IntentFilter(); 

    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      ... 
     } 
    } 

    registerReceiver(receiver, filter); 
}  

그리고 BroadcastReceiveronDestory() 수명주기 방법으로 등록 해제해야합니다

@Override 
protected void onDestroy() { 
    unregisterReceiver(receiver); 
} 

은 아직 등록되지 않은 BroadcastReceiver 등록을 취소의 시나리오를 방지 할 수 있습니다.

+0

파괴시 (https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29) 호출 할 수 없습니다. 리소스를 바인딩하는 것이 좋습니다 .Remume-onPause – Picci

5

방송 수신기/코드 주위에 catch 블록을 시도 포장

protected void onPause() { 
    this.unregisterReceiver(reciever); 
    super.onPause(); 
} 
+0

소스가있는 곳 ? –

2

가장 쉬운 옵션이 될 것 onPause() 수명주기 방법에서 등록 해제해야합니다.

try{ 
    ... 
    this.unregisterReceiver(reciever); 
    } 
    catch(IllegalArgumentException e) 
    { 
     // TODO: handle exception 
    } 
    catch (Exception e) { 
     // TODO: handle exception 
    } 
관련 문제