Android BrocastReceiver 분석

4803 단어
간단 한 소개
BroadcastReceiver (방송 수신 기) 는 Android 4 대 구성 요소 중 하나 로 시스템 범위 내 에 응답 하 는 방송 구성 요소 입 니 다. Android 시스템 과 다른 app 에서 방송 메 시 지 를 보 내 거나 받 을 수 있 습 니 다. 게시 - 구독 디자인 모델 과 유사 합 니 다.비동기 적 인 것 이 특징 이 며, 방송 발송 자 는 수신 자가 있 는 지 없 는 지 에 관심 을 갖 지 않 는 다.서로 다른 구성 요소 간 의 통신, 다 중 스 레 드 통신 과 시스템 이 특정한 상황 에서 의 통신 에 사용 할 수 있다.
의 원리
방송 유형 과 브 로드 캐 스 트 Receiver 등록 방식 에 따라 구체 적 으로 달라 질 수 있다.그러나 전체적인 절 차 는 대체적으로 다음 과 같다.
  • 방송 수신 자 BroadcastReceiver 는 Binder 체 제 를 통 해 AMS (Activity Manager Service) 에 등록 합 니 다.
  • 방송 발송 자 는 Binder 체 제 를 통 해 AMS 에 방송 을 보낸다.
  • AMS 는 해당 조건 (IntentFilter / Permission 등) 에 맞 는 BroadcastReceiver 를 찾 아 BroadcastReceiver (일반적으로 Activity) 에 해당 하 는 메시지 순환 대기 열 에 방송 을 보 냅 니 다.
  • 메 시 지 를 순환 적 으로 실행 하여 이 방송 을 받 고 BroadcastReceiver 의 onReceive () 방법 을 되 돌려 줍 니 다.유형
  • 일반 방송 (일반 방송)
  • 일반 방송 은 완전히 비동기 적 이 며, Context 의 sendbBroadcast () 방법 으로 보 내 며, 메시지 전달 효율 이 높 지만, 모든 receivers (수신 기) 의 실행 순 서 는 불확실 하 다.수신 기 가 처리 결 과 를 다음 수신 기 에 전달 하지 못 하고 중간 에 방송 을 종료 할 수 없다 는 것 이 단점 이다.
    val intent = Intent()
    intent.action = RECEIVE_TOKEN
    sendBroadcast(intent)
  • 시스템 방송 (System Broadcast)
  • 안 드 로 이 드 시스템 에는 여러 개의 시스템 방송 이 내장 되 어 있 으 며, 휴대 전화의 기본 조작 과 관련 되면 기본적으로 해당 하 는 시스템 방송 을 보 낼 것 이다.예 를 들 어 켜 기 시작, 충전 과 전기량 변화, 네트워크 상태 변화, 사진 찍 기, 화면 끄 기 와 켜 기 등 이다.모든 시스템 방송 은 특정한 intent - filter 를 가지 고 있 는데 그 중에서 구체 적 인 action 을 포함 하고 시스템 방송 이 나 오 면 해당 하 는 BroadcastReceiver 에 의 해 수신 된다.
  • 질서 있 는 방송 (주문 방송)
  • '질서' 는 방송 수신 자 에 게 보 내 는 방송 이 BroadcastReceiver 에 의 해 선착순 으로 수신 되 는 것 을 말 합 니 다. receiver 의 intent - filter 중의 android: priority 속성 을 통 해 우선 순 위 를 설정 하고 우선 순 위 는 - 1000 ~ 1000 에서 많 을 수록 우선 순위 가 높 습 니 다.priority 속성 동일 자, 동적 등 록 된 방송 우선.그 사용 과정 은 일반 방송 과 매우 유사 하 며, 차 이 는 방송의 전송 방식 이 Context. sendOrdered Broadcast () 방법 으로 만 발송 되 는 데 있다.
  • 앱 내 방송 (Local Broadcast)
  • Android 의 방송 은 앱 을 뛰어넘어 직접 통신 할 수 있어 성능 소모 와 안전성 문 제 를 일 으 킬 수 있 습 니 다. 이러한 문 제 를 해결 하기 위해 전역 방송 을 국부 방송 으로 설정 하거나 봉 인 된 LocalBroadcastManager (동적 등록 만 가능) 클래스 를 사용 합 니 다.부분 방송 방식 설정:
  • 라디오 등록 시 exported 속성 을 false
  • 로 설정
  • 권한 검증 에 사용 할 권한 permission 을 추가 합 니 다
  • 이 방송 수신 기 가 있 는 가방 이름 지정
  • LocalBroadcastManager 사용
    //    , Activity.onResume  
    val intentFilter = IntentFilter()
    val broadcastReceiver = BroadcastReceiver()
    intentFilter.addAction(RECEIVE_TOKEN)
    LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
    //    
    val intent = Intent()
    intent.action = RECEIVE_TOKEN
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
    //    , Activity.onPause  
    LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)

    책.
  • 정적 등록
  • Manifest. xml 파일 의 노드 에 직접 설정 하고 < receiver > 탭 설명 을 사용 하 며 탭 에 사용 합 니 다. < intent-filter > 탭 에 필 터 를 설정 합 니 다. 이 등록 방식 은 app 이 활성 상태 에 있 든 없 든 감청 합 니 다.
     //          
        
            
        
    

    그러나 주의해 야 할 것 은 안 드 로 이 드 8.0 시스템 이 정적 방송 을 변경 하여 구체 적 으로 볼 수 있다 는 것 이다.https://blog.csdn.net/fomin_zhu/article/details/84454042]
  • 동적 등록
  • 코드 에서 Context. register Receiver () 방법 을 직접 호출 하여 등록 하고 unregister Receiver 를 호출 하여 등록 을 취소 합 니 다.
    override fun onResume() {
        super.onResume()
        //    , Activity.onResume  
        val intentFilter = IntentFilter()
        intentFilter.addAction(RECEIVE_TOKEN)
         LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        //    , Activity.onPause  
    LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
    }

    동적 방송 은 Activity 에서 하 는 게 좋 을 것 같 아 요. 의 onResume () 등록, onPause () 로그아웃 은 동적 방송 에 대해 등록 이 있 으 면 반드시 로그아웃 이 있어 야 하기 때문에 그렇지 않 으 면 메모리 가 유출 될 수 있 습 니 다.onResume () 등록, onPause () 로그아웃 은 onPause () 가 앱 이 사망 하기 전에 반드시 실행 되 기 때문에 방송 이 앱 이 사망 하기 전에 반드시 로그아웃 되 어 메모리 유출 을 방지 할 수 있 습 니 다.
  • 둘 의 차이
  • Manifest. xml 에 정적 으로 등록 하고 코드 에서 동적 으로 호출
  • 정적 은 상주 하 는 것 으로 생명주기 의 영향 을 받 지 않 고 전기 소모 와 메모 리 를 차지한다.동적 은 사용 해야만 등록 하고 구성 요소 의 생명주기 에 따라

  • 주의 하 다.
    서로 다른 등록 방식 의 라디오 수신 기 리 셋 OnReceive () 의 context 리 셋 값 은 다르다
  • 정적 등록 방송, content 는 android. app. Receiver Restricted Context 입 니 다. 이 context 는 Activity 형식 이 아니 므 로 AlertDialog
  • 를 직접 구성 할 수 없습니다.
  • 동적 등록 방송, onReceive () 방법 에 들 어 오 는 Context 대상 context 는 사실 sendbBroadcast () 를 호출 하 는 Activty 대상 입 니 다.그러나 Local BroadcastManager 방식 은 Application Context
  • 를 되 돌려 줍 니 다.

    좋은 웹페이지 즐겨찾기