방송 수신자Pao Ding Jie Niu


이 섹션 소개:

이전 섹션에서 우리는 이미 BroadcastReceiver에 대해 사전적으로 이해했으며 표준과 주문이라는 두 가지 방송 유형을 알고 있었습니다. 방송 수신기를 동적으로 또는 정적으로 등록하고, 시스템 방송을 듣고, 직접 방송을 보내세요! 우리의 기본 요구 사항이 충족되었습니다 ~ 하지만 위에 적힌 방송은 모두 글로벌 방송이에요! 이는 또한 당사 앱에서 보낸 방송이 다른 앱에서 수신된다는 의미이기도 합니다. 또는 다른 앱에서 보낸 방송이 우리 앱에서도 수신되므로 보안 문제가 쉽게 발생할 수 있습니다! 그리고 Android는 로컬 브로드캐스트 메커니즘을 제공합니다. 이 메커니즘을 사용하여 발행된 브로드캐스트는 APP 내에서만 전파됩니다. 방송 수신자는 이 애플리케이션에서 보낸 방송만 수신할 수 있습니다!


1. 로컬 방송

1) 핵심 사용법:

1.png

PS: 로컬 방송은 정적 등록을 통해 허용되지 않습니다. 시스템 글로벌 방송에 비해 더 효율적입니다.

2) 참고:

2.png

3) 코드 예(사용자를 오프라인으로 추방하려면 다른 곳에서 로그인):

WeChat처럼 WeChat을 실행하고 다른 휴대폰을 사용하여 계정에 다시 로그인하면 이전 휴대폰에서 해당 계정에 알림이 표시됩니다. 이렇게 다른 터미널에 로그인한 다음 열려 있던 모든 활동을 닫고 다음과 같이 로그인 페이지로 돌아갑니다~
아래에 간단한 예를 작성해 보겠습니다.

렌더링 실행:

3.gif

코드 구현:

1단계: 이전 활동에서 제공한 ActivityCollector를 준비합니다.

ActivityCollector.java

public class ActivityCollector {
    private static List<Activity> 활동 = 새 ArrayList<Activity>();
    public static void addActivity(활동 활동) {
        activities.add(activity);
    }
    public static void removeActivity(활동) {
        activity.remove(활동 );
    } ㅋㅋㅋ  }
        }
    }
}



2단계
:先写要给简单的BaseActivity,用来继承,接着写下登陆界면!

public 클래스 BaseActivity는 AppCompatActivity를 확장합니다 {    @Override    protected void onCreate(번들 저장됨 InstanceState) {

        super.onCreate(savedInstanceState);
        ActivityCollector .addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

LoginActivity.java:


public 클래스 LoginActivity는 BaseActivity를 확장하여 View.OnClickListener를 구현합니다.{


    private SharedPreferences pref;
    private SharedPreferences.Editor editor;

    private EditText edit_user;
    private Edit 텍스트 edit_pawd;
    비공개 버튼 btn_login;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
       pref = PreferenceManager.getDefaultSharedPreferences(this);

        bindViews() ;
    }

    private void bindViews() { ㅋㅋㅋ .btn_login);
        btn_login.setOnClickListener( this);
    }

    @Override
    protected void onStart() {
        super.onStart();
       if(!pref.getString("user","").equals("")){
            edit_user. setText (pref.getString("user",""));
           edit_pawd.setText(pref.getString("pawd",""));
        }
    }

    @Override
    public void onClick(View v) {
String user = edit_user.getText().toString();
        String pawd = edit_pawd.getText().toString();
        if(user.equals("123")&&pawd.equals("123")){
            편집자 = pref.edit();
            editor.putString("user", user);
editor.putString("pawd", pawd);
                  editor.commit();                                                                 > ~                                    토스트. : Override
public void onReceive(최종 컨텍스트 컨텍스트, 인텐트 의도) {
AlertDialog.BuilderDialogBuilder = new AlertDialog.Builder(context);
DialogBuilder.setTitle("경고:");
dia logBuilder.setMessage("귀하의 계정은 다음과 같습니다. 다른 곳 로그인 후 로그인해주세요~");
DialogBuilder.setcanceLable(false);
DialogBuilder.setpositoryButton("OK",
New Dialoginterface.onClicklistener() Errideb Public Void Onclick(Dialoginterface Dialog, Int which) {
ActivityCollector. Finishall();
인치 의도 = 새 의도(컨텍스트, loginactivity.class);                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                       context.startActivity(intent);
                 }
               });
       AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getWindow().setType(
               WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }
}


AndroidManifest에 시스템 대화 상자 권한을 추가하는 것을 잊지 마세요. localBroadcastManager를 인스턴스화하고 이를 사용하여 관련 작업을 완료하고 추가로 삭제합니다. unregisterReceiver에 주목하세요!

MainActivity.java

public 클래스 MainActivity는 BaseActivity를 확장합니다.{

    private MyBcReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R. layout.activity_main);
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        //初始化广播接收者,设置过滤器
        localReceiver = new MyBcReceiver( );
        intentFilter = new IntentFilter();
        intentFilter.addAction("com .jay.mybcreceiver.LOGIN_OTHER");
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);

        버튼 btn_send = (버튼) findViewById(R.id.btn_send);
        btn_ send.setOnClickListener(new View.OnClickListener() {
            @ 재정의
           public void onClick(View v) {
               인텐트 의도 = new Intent("com.jay.mybcreceiver.LOGIN_OTHER");
              localBroadcastManager.sendBroadcast(intent);
           }
        });
    }

    @Override
    보호됨 void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
}

알겠습니다. 간단합니다. 활동을 등록하는 것을 잊지 마세요~


2. Android 4.3 이상 버전에서 부팅 브로드캐스트 모니터링 문제 해결:

Android 4.3 이상 버전에서는 다음을 설치할 수 있습니다. SD의 응용 프로그램, 우리 모두는 시스템이 시작된다는 것을 알고 있습니다. SD 카드는 짧은 간격 후에만 로드되므로 우리 애플리케이션이 이 방송을 모니터링하지 못할 수도 있습니다! 따라서 부팅 브로드캐스트와 SD 카드 장착 브로드캐스트를 모두 모니터링해야 합니다!

또한 일부 휴대폰에는 SD 카드가 없을 수 있으므로 이 두 개의 방송 모니터를 동일한 인터넷 필터에 쓸 수 없습니다. 대신 구성 코드는 다음과 같이 작성해야 합니다.

<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
"/>
          </intent- 필터>
                                                                                                             INTENT.ACTION.MEDIA_UNMOUNTED"/>
                                      <

3. 일반적으로 사용되는 시스템 방송 요약:

마지막으로 우리가 일반적으로 사용할 수 있는 몇 가지 시스템 방송을 알려드리겠습니다.

Intent.ACTION_AIRPLANE_MODE_CHANGED;
//비행기 모드에서 방송을 끄거나 켜세요

<strong>Intent.ACTION_BATTERY_CHANGED;
//충전 상태 또는 배터리 전력 변경
//배터리 충전 상태 및 충전 수준 변경, 이 브로드캐스트는 확립문을 통해서는 수신될 수 없으며 Context.registerReceiver()

<strong>Intent.ACTION_BATTERY_LOW;
//Indicates low Battery power

<strong>Intent.ACTION_BATTERY_OKAY;
//배터리 전원이 충분함을 나타냅니다. 즉, 배터리 전원이 부족에서 최대로 변경되면 브로드캐스트가 발행됩니다.

Intent.ACTION_BOOT_COMPLETED;
//시스템 시작이 완료된 후 이 작업이 한 번만 브로드캐스트됩니다(한 번만). .

Intent.ACTION_CAMERA_BUTTON;
//사진 촬영 시 카메라 버튼(하드웨어 버튼)을 누르면 방송

Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
//화면이 타임아웃되어 화면이 잠길 때, 사용자가 전원 버튼을 눌렀을 때, 길게 누르거나 짧게 누르기(대화상자 팝업 여부에 관계없이), 화면을 잠글 때 안드로이드 시스템은 이 작업 메시지를 브로드캐스트합니다

Intent.ACTION_CONFIGURATION_CHANGED;
//기기의 현재 설정이 있을 때 브로드캐스트가 전송됩니다. (변경사항 포함: 인터페이스 언어, 장치 방향 등, Configuration.java를 참조하세요)

Intent.ACTION_DATE_CHANGED;
//이 브로드캐스트는 장치 날짜가 변경되면 내보내집니다

Intent.ACTION_DEVICE_STORAGE_LOW;
// 기기 메모리가 부족할 때 내보내는 방송입니다. 이 방송은 시스템에서만 사용되며 다른 앱에서는 사용할 수 없나요?

Intent.ACTION_DEVICE_STORAGE_OK;
//기기 메모리가 부족할 때 전송되는 방송입니다. 이 방송은 시스템에서만 사용할 수 있고 다른 앱에서는 사용할 수 없나요?

Intent.ACTION_DOCK_EVENT;
//
//이 브로드캐스트가 전송되는 장소 FrameworksbaseservicesjavacomandroidserverDockObserver.java

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
////모바일 APP 완료 후 브로드캐스트가 전송됩니다(모바일은 APP2SD를 의미함) )

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
//APP가 이동 중일 때 전송되는 브로드캐스트(모바일은 APP2SD를 의미함)

Intent.ACTION_GTALK_SERVICE_CONNECTED;
//Gtalk가 연결되었을 때 전송되는 브로드캐스트

Intent.ACTION_GTALK_SERVICE_ 연결이 끊어졌습니다. talk
// g 연결이 끊어지면 연결된 방송이 연결된 방송이 끊어 졌을 때의 연결이 끊어졌습니다. action_headset_plug;
// 헤드폰에 헤드폰을 삽입 할 때 방송. 로케일이 변경되었을 때 기기가 현재 브로드캐스트 중입니다

Intent.ACTION_MANAGE_PACKAGE_STORAGE;
//

Intent.ACTION_MEDIA_BAD_REMOVAL;
//SD 카드가 올바르게 제거되지 않았습니다(SD 카드를 제거하는 올바른 방법: 설정--SD 카드 및 장치 메모리- -SD 카드 제거), 그러나 SD 카드를 꺼냈을 때 브로드캐스트가 전송되었습니다
//브로드캐스트: 확장 미디어(확장 카드)가 SD 카드 슬롯에서 뽑혔지만 마운트 지점( 마운트 지점)이 해제되지 않았습니다(마운트 해제)

Intent.ACTION_MEDIA_BUTTON;
//"미디어 버튼" 버튼을 눌렀을 때, "미디어 버튼" 버튼(하드웨어 버튼)이 있는 경우 방송

Intent.ACTION_MEDIA_CHECKING;
//SD 카드 등 외부 저장 장치를 삽입한 경우, 시스템이 SD 카드를 확인합니다. 이때 전송되는 브로드캐스트는?
Intent.ACTION_MEDIA_EJECT;
//외부 대용량 저장 장치(예: SD 카드 또는 모바일 하드 디스크)에서 전송된 브로드캐스트가 연결 해제됩니다. 올바르게 제거되었는지 여부에 관계없이 전송됩니다.
//Broadcast : 사용자가 확장 미디어를 제거하려고 합니다(확장 카드를 뽑습니다).
Intent.ACTION_MEDIA_MOUNTED;
//SD 카드가 삽입되고 올바르게 설치(인식)되면 브로드캐스트
//브로드캐스트: 확장 미디어가 삽입되어 마운트되었습니다.
Intent.ACTION_MEDIA_NOFS;
//
Intent.ACTION_MEDIA_REMOVED;
//외부 저장 장치가 제거되었습니다. 제대로 제거되었는지 여부에 관계없이 이 브로드캐스트가 실행됩니까?
// 방송: 확장 미디어가 제거되었습니다.
Intent.ACTION_MEDIA_SCANNER_FINISHED;
//Broadcast: 미디어 디렉터리가 검색되었습니다.
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;
//
Intent.ACTION_MEDIA_SCANNER_STARTED;
//Broadcast: 미디어 디렉터리가 검색되었습니다.

Intent.AC TION_MEDIA_SHARED;
// 방송: USB 대용량 저장소로 공유되었기 때문에 확장 미디어가 마운트 해제되었습니다.
Intent.ACTION_MEDIA_UNMOUNTABLE;
//
Intent.ACTION_MEDIA_UNMOUNTED
//Broadcast: 확장 미디어가 존재하지만 마운트(마운트)되지 않았습니다.
Intent.ACTION_NEW_OUTGOING_CALL;

Intent.ACTION_PACKAGE_ADDED;
//APK 설치 성공 후
//Broadcast: 새 애플리케이션 패키지가 기기에 설치됩니다.
//새 애플리케이션 패키지가 장치에 설치되었으며 데이터에는 패키지 이름이 포함됩니다(최신 설치된 패키지 프로그램은 이 브로드캐스트를 수신할 수 없음)
Intent.ACTION_PACKAGE_CHANGED
//패키지를 포함하여 기존 애플리케이션 패키지가 변경되었습니다. name
Intent.ACTION_PACKAGE_DATA_CLEARED;
//애플리케이션 데이터를 지울 때 방송이 발생합니다(설정--애플리케이션 관리--애플리케이션을 선택한 다음 데이터 지우기를 클릭하시겠습니까?)
//사용자가 패키지의 데이터를 지웠습니다. 패키지 이름 포함(패키지 클리어 프로그램은 본 방송을 수신할 수 없습니다)

Intent.ACTION_PACKAGE_INSTALL;
//전자마켓에서 애플리케이션을 다운로드하는 등 방송의 다운로드를 트리거하고 설치를 완료하시겠습니까?
//
Intent.ACTION_PACKAGE_REMOVED;
//APK를 성공적으로 삭제한 후 방송이 전송되었습니다.
//기존 애플리케이션 패키지가 패키지 이름을 포함하여 기기에서 제거되었습니다(설치 중인 패키지 프로그램은 이 방송을 받을 수 없습니다)

Intent.ACTION_PACKAGE_REPLACED;
//기존 설치 패키지를 교체할 때 방송이 내보내집니다(이 방송은 현재 설치된 앱이 이전 앱보다 최신인지, 이전 앱인지에 관계없이 내보내집니다.)
Intent.ACTION_PACKAGE_RESSTARTED;
/ / 사용자가 패키지를 다시 시작하면 패키지의 모든 프로세스가 종료되고 패키지 이름을 포함하여 패키지와 관련된 모든 런타임 상태가 제거되어야 합니다(패키지 프로그램을 다시 시작하면 이 브로드캐스트를 받을 수 없음)
Intent.ACTION_POWER_CONNECTED;//외부 전원 연결 시 방송
Intent.ACTION_POWER_DISCONNECTED;
//외부 전원 연결 해제 시 방송
Intent.ACTION_PROVIDER_CHANGED;
//

Intent.ACTION_REBOOT;
//기기 재시작 시 방송

Intent.ACTION_SCREEN_OFF;
//화면이 꺼진 후 방송

Intent.ACTION_SCREEN_ON;
//화면이 켜진 후 방송

Intent.ACTION_SHUTDOWN;
//시스템이 꺼진 후 방송

Intent.ACTION_TIMEZONE_CHANGED ;
//시간대가 변경되면 방송

Intent.ACTION_TIME_CHANGED;
//시간이 설정되면 방송

Intent.ACTION_TIME_TICK;
//Broadcast: 현재 시간이 변경되었습니다(일반 타임랩스).
//현재 시간은 1분마다 변경되어 전송됩니다. Context.registerReceiver() 메서드를 통해서만 등록할 수 있습니다.

Intent.ACTION_UID_REMOVED//사용자가 전송한 브로드캐스트입니다.
//

Intent.ACTION_UMS_CONNECTED;
//기기가 USB 대용량 저장 상태에 진입하면 방송되나요?

Intent.ACTION_UMS_DISCONNECTED;
//기기가 USB 대용량 저장소 상태에서 정상 상태로 변경되면 방송할까요?

Intent.ACTION_USER_PRESENT;
//

Intent.ACTION_WALLPAPER_CHANGED;
//기기 배경화면이 변경되면 브로드캐스트

4 이 섹션 요약:

좋아요, 여기까지가 BroadcastReceiver에 대한 학습입니다. 추가사항이나 제안사항이 있으시면 언제든지 환영합니다~ 정말 감사합니다~