Android 4대 구성 요소 BroardcastReceiver 편 소개
브로드캐스트 수신자(BroadcastReceiver)는 Android의 4대 구성 요소 중 하나로 브로드캐스트 Intent를 수신하는 데 사용되며, 브로드캐스트 Intent의 발송은 호출을 통해Context.sendBroadcast()、Context.sendOrderedBroadcast () 로 이루어집니다.일반적으로 하나의 브로드캐스트 Intent는 이 Intent에 가입한 여러 브로드캐스트 수신자에게 수신될 수 있습니다.
방송은 응용 프로그램 사이에서 정보를 전송하는 광범위하게 운용되는 메커니즘이다.BroadcastReceiver는 전송된 방송을 필터하여 수신하고 응답하는 일종의 구성 요소이다.응용 프로그램은 외부 이벤트를 필터해서 관심 있는 외부 이벤트 (예를 들어 전화가 호출되었을 때, 데이터 네트워크가 사용할 수 있을 때) 만 수신하고 응답할 수 있습니다.방송 수신기에는 사용자 인터페이스가 없다.그러나, 이들이 받은 정보에 응답하기 위해activity나serice를 시작하거나, Notification Manager로 사용자에게 알릴 수 있습니다.알림은 등불 깜빡임, 진동, 소리 재생 등 다양한 방식으로 사용자의 주의를 끌 수 있다.일반적으로 상태 표시줄에 오래된 아이콘을 놓으면 사용자가 그것을 열고 정보를 얻을 수 있습니다.
BroadcastReceiver 자체는 도형 사용자 인터페이스를 실현하지 못하지만, 어떤 알림을 받은 후BroadcastReceiver는Activity를 응답으로 시작하거나, NotificationMananger를 통해 사용자에게 알림을 보내거나 서비스를 시작할 수 있습니다.
BroadcastReceiver 사용
브로드캐스트 Intent 단계를 수신하려면 다음과 같이 하십시오.
1. BroadCastReceiver의 클래스를 계승하고 onReceive () 방법을 다시 씁니다. 방송 수신기는 이 방법을 실행할 때만 활성화됩니다.onReceive () 가 되돌아오면 부활 상태가 됩니다. 주의: 사용자의 상호작용 과정이 원활함을 확보하기 위해, 클래스 이름인 SMSBroadcastReceiver 같은 시간 걸리는 작업은 라인에 넣어야 합니다.
public class SMSBroadcastReceiver extends BroadcastReceiver {
// action
String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals( SMS_RECEIVED )) {
// : 、 、
}
}
}
2. 이 방송 수신자를 등록하려면 두 가지 방법이 있는데 프로그램 동적 등록과 안드로이드 매니페스트 파일에서 정적 등록(시스템에 등록된 것으로 이해할 수 있음)은 다음과 같다. 권한을 성명해야 한다. 아래의 priority는 방송을 수신하는 단계를 나타낸다.
< receiver android:name = ".SMSBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = " android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >
</ receiver >
< uses-permission android:name = "android.permission.RECEIVE_SMS" />
< uses-permission android:name = "android.permission.SEND_SMS" />
프로그램의 동적 등록, 등록된 방송, 아래의 priority는 방송을 받는 등급이'2147483647'이 가장 높은 우선순위임을 나타낸다
IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );
registerReceiver(smsBroadcastReceiver , intentFilter);
3. 로그아웃
한마디로 unregisterReceiver(smsBroadcastReceiver)를 해결한다.onPause나 onDestroy에서 로그아웃하는 것을 권장합니다.
브로드캐스트 유형에는
Context를 통한 일반 브로드캐스트Intent my Intent
Context를 통한 순차적 브로드캐스트sendOrderedBroadcast(intent,receiverPermission)가 발송한 것으로 이 방법의 두 번째 파라미터는 이 방송의 등급을 결정한다. 등급 수치는 -1000에서 1000 사이이고 값이 클수록 발송의 우선순위가 높다.방송 수신자가 방송을 수신할 때의 등급(intent Filter의 priority를 통해 2147483647로 설정할 때 우선순위가 가장 높음)은 같은 등급의 수신은 무작위이고 낮은 등급으로 방송을 받을 수 있다. 높은 등급이나 같은 등급으로 먼저 방송을 수신할 수 있는abortBroadcast() 방법으로 방송을 차단하여 다른 수신자가 이 방송을 받지 못하게 한다.다른 구조 함수도 있어요.
Context를 통한 비동기 브로드캐스트sendStickyBroadcast(Intent myIntent)에서 보내고sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras) 방법도 있는데 이 방법은 질서정연한 방송 특성도 있고 비동기 방송 특성도 있다.비동기 방송 보내기 요점:
참고: 브로드캐스트를 보낼 때 intent 매개 변수와 Contex.startActivity () 가 시작된 Intent와 달리 전자는 여러 개의 구독 라디오 수신기에 호출될 수 있고, 후자는 한 개의 (Activity 또는 서비스에만 호출될 수 있습니다.
BroadcastReceiver 수명 주기
방송이 올 때마다 BroadcastReceiver 대상을 다시 만들고 onReceive () 방법을 호출합니다. 실행이 끝난 후에 이 대상은 삭제됩니다.onReceive () 방법이 10초 안에 실행되지 않으면, 안드로이드는 이 프로그램이 응답하지 않는다고 생각할 것입니다.그래서
BroadcastReceiver에서는 시간이 많이 걸리는 동작을 할 수 없습니다. ANR (Application No)
Response) 대화상자입니다.
시간이 많이 걸리는 작업을 수행하려면 Intent를 Service에 전송하여 Service에서 수행해야 합니다.여기서 하위 스레드를 사용해서 해결할 수 없습니다. 왜냐하면 BroadcastReceiver의 생명 주기가 매우 짧기 때문에 하위 스레드가 아직 끝나지 않았을 수도 있고 BroadcastReceiver가 먼저 끝났습니다.BroadcastReceiver가 끝나면 BroadcastReceiver가 있는 프로세스는 시스템이 메모리를 필요로 할 때 우선적으로 죽기 쉽다. 빈 프로세스에 속하기 때문이다. (활성 구성 요소가 없는 프로세스)만약 그것의 숙주 프로세스가 죽었다면, 작업 중인 하위 라인도 죽었을 것이다.그래서 서브라인으로 해결하는 것은 믿을 수 없는 것이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.