Android 개발 노트(42) Broadcast의 수명 주기

Broadcast 소개
Android 구성 요소 간의 유연한 통신을 위한 브로드캐스트 기능 브로드캐스트(Activity 및 Service)의 차이점은 다음과 같습니다.
1. Activity와 서비스는 모두 일대일로 통신할 수 있고 Broadcast는 한 쌍이 많고 한 사람이 방송을 보내고 여러 사람이 수신하여 처리할 수 있다.
2. 송신자에게 방송은 수신자가 일을 하고 있는지 없는지를 고려할 필요가 없다. 수신자가 일을 하고 있으면 방송을 받고 일을 하지 않으면 방송을 버린다.
3. 수신자에게 있어서 각양각색의 방송을 받을 수 있기 때문에 수신자는 먼저 조건에 부합되는 것을 스스로 여과한 다음에 하도급 처리를 할 수 있다.
4. 일반적인 상황에서Activity와 서비스는 모두 라인 내부에서 통신하는데 Broadcast는 라인 내 통신에도 사용할 수 있고 라인 간 통신에도 사용할 수 있으며 프로세스 간 통신에도 사용할 수 있다.
방송의 용도는 실제 개발에서 방송은 일반적으로 다음과 같은 용도가 있다.
1. 서로 다른 코드 파일에서 상대방의 페이지 컨트롤을 조종하는 장면, 예를 들어 FragmentActivity와 Fragment 코드 간의 통신, 그리고Activity와 Adapter 코드 간의 통신에 적용된다.
2. 서로 다른 스레드 간의 통신에 적용된다. 비록 스레드 간의 통신은Thread+Handler, AsyncTask 등 방식을 사용할 수 있지만 방송의 적응 면이 더욱 넓다. 안드로이드 버스 통신 프레임워크인 EventBus는 Broadcast를 바탕으로 구축된 것이다.
3. 서로 다른 프로세스 간의 통신에 적용되며 서로 다른 APP 간의 통신에도 사용할 수 있고 시스템과 APP 간의 통신에도 사용할 수 있다.
Broadcast 호출
브로드캐스트 호출 방법sendBroadcast: 브로드캐스트 전송
registerReceiver: 수신기를 등록합니다. 일반적으로 onStart 또는 onResume 방법에서 등록합니다.
unregisterReceiver: 수신기를 로그아웃합니다. 보통 onStop이나 onPause 방법에서 로그아웃합니다.
프로세스 내 방송과 프로세스 간 방송은 만약에 방송이 응용 프로그램 내에서 사용된다면 크로스 프로세스가 필요하지 않고 LocalBroadcastManager를 고려할 수 있다. 왜냐하면 이렇게 하면 더욱 효율적이기 때문이다(크로스 프로세스 통신이 필요하지 않다). 또한 방송 개방으로 인한 안전 문제를 고려할 필요가 없다(다른 응용 프로그램도 방송을 받을 수 있다면).
프로세스 내 브로드캐스트, LocalBroadcastManager 클래스의 registerReceiver 및 unregisterReceiver 방법을 사용하는 것이 좋습니다. 코드의 예는 다음과 같습니다.
//     
LocalBroadcastManager.getInstance(this).registerReceiver(guestReceiver, filter);
//     
LocalBroadcastManager.getInstance(this).unregisterReceiver(guestReceiver);

프로세스 간 커뮤니케이션에서는 다음과 같은 코드 예제를 사용하여 Context 클래스의 registerReceiver 및 unregisterReceiver 메서드를 사용하는 것이 좋습니다.
//     ,  activity  ,   mContext,    registerReceiver unregisterReceiver
mContext.registerReceiver(guestReceiver, filter);
//     
mContext.unregisterReceiver(guestReceiver);

Broadcast의 수명 주기
브로드캐스트, 브로드캐스트 전송은 간단합니다. 요청을 보내기만 하고 요청의 처리 결과에 관심이 없습니다. 코드의 예는 다음과 같습니다.
Intent intent = new Intent("com.example.exmbrdlife.fragment");
intent.putExtra("guest", "   ");
//      
//mContext.sendBroadcast(intent);
//      
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);

방송을 수신하는 방식은 동적 등록, 정적 등록, 끼워넣기 등록 세 가지 방식으로 나뉜다.
동적 등록은 코드에서 호출 방법인registerReceiver와 unregisterReceiver를 가리킨다.그것의 생명주기는registerReceiver에서 시작하고 unregisterReceiver에서 끝납니다. 보통 어떤Activity의 생명주기와 함께 끝납니다.
정적 등록은 AndroidManifest를 말합니다.xml에receiver 수신기를 등록하면receiver 노드와activity와 서비스 노드는 동급 관계입니다.그것의 생명주기는 시스템 시작에서 시작되고 시스템 종료에서 끝나며 시스템 운행 과정에서 조건에 맞는 방송을 받으면 수신기가 작동한다.다음은 xml 파일에 정적 등록된 예입니다.
        <receiver android:name="com.app.mastersec.notify.BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
중첩 등록도 안드로이드 매니페스트에 해야 합니다.xml에receiver 수신기를 등록합니다.정적 등록과 다른 점은 정적 등록의receiver 코드는 단독 자바 파일이고, 플러그인 등록의receiver 코드는 특정한 자바 클래스에 삽입되어 있기 때문에 등록할 때receiver 클래스 이름 앞에 '주 클래스 이름 $' 을 붙여야 한다는 것이다.또한 플러그인에 등록된receiver 클래스는 정의할 때static 표시를 붙여야만 정상적으로 접근할 수 있습니다.다음은 xml 파일에 등록된 예입니다.
        <receiver android:name=".DownloadActivity$DownloadCompleteReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            </intent-filter>
        </receiver>

APP 브로드캐스트 수신(동적 등록 방식) APP 브로드캐스트를 수신하면 동적 등록을 사용하거나 정적 등록을 사용할 수 있습니다. 다음 코드는 동적 등록 방식으로 예를 들어 설명합니다.
	@Override
	public void onStart() {
		super.onStart();
		guestReceiver = new GuestReceiver();
		IntentFilter filter = new IntentFilter("com.example.exmbrdlife.fragment");
		LocalBroadcastManager.getInstance(this).registerReceiver(guestReceiver, filter);
	}


	@Override
	public void onStop() {
		LocalBroadcastManager.getInstance(this).unregisterReceiver(guestReceiver);
		super.onStop();
	}


    private GuestReceiver guestReceiver;
    private class GuestReceiver extends BroadcastReceiver {


        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String guest = intent.getStringExtra("guest");
                Toast.makeText(MainActivity.this, "     "+guest, Toast.LENGTH_LONG).show();
            }
        }
    }
위에서 라디오를 등록할 때 IntentFilter 클래스를 사용하여 필터를 하였는데 필터 조건에 부합되는 라디오만 수신 처리될 수 있음을 주의하십시오.
수신 시스템 방송(정적 등록 방식) 수신 시스템 방송은 정적 등록 방식만 사용할 수 있습니다. 아래 코드는 시스템 시작 방송을 예로 하고 xml 수정 부분은 위에 있는 안드로이드 매니페스트입니다.xml 예는 다음과 같습니다.
import com.app.mastersec.util.ServiceUtil;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.app.mastersec.util.LogUtil;


public class BootReceiver extends BroadcastReceiver {
	private static final String TAG = "BootReceiver";


	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent != null) {
			if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
				//         APP   
				if (ServiceUtil.isWorked(context, ServiceUtil.notify_service) != true) {
					LogUtil.debug(TAG, "receive boot action, start service");
					Intent mIntent = new Intent(context, NotifyService.class);
					Bundle bundle = new Bundle();
					bundle.putInt("start_type", NotifySend.SYSTEM_BOOT);
					mIntent.putExtras(bundle);
					context.startService(mIntent);
				}
			}
		}
	}

}

시스템 브로드캐스트 목록 아래에는 일반적인 시스템 브로드캐스트 지침이 나와 있습니다.
Intent 클래스
ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";//시스템 부팅이 끝났습니다. 라디오를 울리려면 권한이 추가되어야 합니다RECEIVEBOOT_COMPLETED
   
ACTION_TIME_TICK = "android.intent.action.TIME_TICK";//분당 라디오
ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";//시간대 설정 변경
ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";//날짜 설정 변경
ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";//시간 설정 변경
ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED";//알람 설정 변경
ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";//배터리 전원 변경
ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";//화면 보호기
ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";//화면 복구
Connectivity Manager 클래스
CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";//네트워크 연결 변경
WifiManager 클래스
WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";//와이파이 상태 변경
Broadcast의 시범 예는 방송 용법에 대한 이해를 깊이 있게 하기 위한 것이다. 다음은 ActionBar와 ViewPager를 결합한 예를 제시하고 Fragment에서 ActionBar를 제어하는 배경을 제시한다.마침 블로거들도 ActionBar에 낙찰된 쪽지의 사용을 복습했다. 관련 블로거는 안드로이드 개발 노트(20) 맨 윗부분 네비게이션 표시줄인 ActionBar를 참조한다.
ActionBar의 내비게이션 모드를 ActionBar로 설정하는 것을 알고 있습니다.NAVIGATION_MODE_TABS는 내비게이션 표시줄 아래에ddTab 방법을 호출하여 구체적인 탭을 추가하고 탭을 클릭하여 ViewPager 페이지를 전환함으로써 완전한 탭 전환 효과를 실현할 수 있다.탭의 클릭 이벤트는 감청기TabListener를 등록하고 onTabSelected 방법에서 현재 ViewPager 페이지를 지정해야 합니다.마찬가지로 ViewPager의 페이지 넘기기 이벤트도 감청기 OnPageChange Listener를 등록해서 onPageSelected 방법에서 현재 탭을 지정해야 합니다.주요 방법인 onTabSelected 및 onPageSelected의 코드 예는 다음과 같습니다.
	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		mViewPager.setCurrentItem(tab.getPosition());
	}


	@Override
	public void onPageSelected(int arg0) {
		mActionBar.selectTab(mActionBar.getTabAt(arg0));
	}
에서 볼 수 있듯이 ViewPager는 setCurrentItem 방법으로 현재 페이지를 설정하는데 Tab은 좀 복잡하다. getPosition(현재 Tab의 위치를 가져오는 것), getTabAt(지정된 위치를 가져오는 Tab), selectTab(현재 선택한 Tab을 설정하는 것) 세 가지 방법이 있다.
편폭에 제한되어 전체 코드는 붙이지 않습니다. 필요한 친구는 댓글에 메일박스를 남길 수 있습니다. 제가 보고 실례 프로젝트를 보내드리겠습니다.다음은 브로드캐스트 테스트 샘플 프로젝트의 효과도입니다.
안드로이드 개발 노트의 전체 디렉터리를 보려면 누르십시오

좋은 웹페이지 즐겨찾기