intent는 실행할 액티비티가 하나일 때만 정상 동장한다. (2개 이상은 하나만 실행, 없을 땐 에러 발생)
intent가 발생하여 브로드캐스트 수행시: 없더라도 에러 발생 x
, 브로드캐스트 여러개면 모두 실행
BroadCast Receiver 내부 구현 내용: 업무처리 x, 이벤트모델 컴포넌트가 필요해서 만들어 놓은것
public class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Toast toast = Toast.makeText(context, "I am Broadcast Receiver", Toast.LENGTH_SHORT);
toast.show();
}
}
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"> </receiver>
sendBroadcast()
이용, Intent 사용Intent intent = new Intent(this, MyReceiver.class)
sendBroadcast(intent)
브로드캐스트 리시버는 앱 내부 + 시스템 상황 감지로도 이용
시스템 브로드캐스트: 많은 브로드캐스트리시버 인텐트 발생시키는데 자주 이용되는 몇가지 설명
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
action의 name
퍼미션
등록 !!<uses-permission android:name="android.permission.RECEIVER_BOOT_COMPLETED"/>
사용자 스마트폰 화면 on/off 사용
시스템에서 브로드캐스트 인텐트 발생시켜 앱에서 브로드캐스트리시버 이용해 상황 감지 가능
매니페스트에 리시버 태그등록하지 않는다(동적 코드 등록 필요)
// 액티비티 / 서비스 클래스 내부 코드
BroadcastReceiver brOn = new BroadcastReceiver(){
public void onReceive(Context context, Intent intent)
Log.d("kkang","screen on..")
}
자바 코드에서 브로드캐스트리시버 정의 후 registerReceiver()
등록
registerReceiver(brOn, new IntentFilter(Intent.ACTION_SCREEN_ON);
// 브로드캐스트리시버는 코드에서 동적으로 등록 해제된다.
unregisterReceiver(btOn)
부팅완료 시점 띄우는 문자열 = "android.intent.action.SCREEN_ON)
브로드캐스트 리시버 등록
으로 감지 가능<!-- outgoing: 전화발신 순간, read_phone: 전화수신 순간 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE".>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
getStringExtra()
로 얻음, 수신번호: Bundle 객체
사용if(action.equals("android.intent.action.NEW_OUTGOING_CALL")){
String phoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
// .,,
} else if(action.equals("android.intent.action.PHONE_STATE")){
Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
String phonNum = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
안드로이드 멀티태스킹
제공: 동시에 여러앱 실행 가능, 백그라운드에서도 실핼될 수 있는 구조
백그라운드 실행 제한 두가지
백그라운드 서비스 제한
브로드캐스트 제한
암시적 인턴트
에 의한 리비서의 실행 제한
BroadcastReceiver
를 실행하는 부분만 제한된다. <receiver android:name=".MyReceiver"
android:enable="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MY_RECEIVER"/>
</intent-filter>
</receiver>
Intent intent = new Intent("com.example.ACTION_MYRECEIVER");
sendBroadcast(intent);