[Android] Broadcast Receiver 를 이용한 App 자동 실행(전원이 켜질때)
1. BootReceiver class 를 만들고 BroadcastReceiver 상속
첫화면으로 띄우고 싶은 class 를 intent 에 담아서 실행
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent intent = new Intent(context, WelcomeActivity.class);
context.startActivity(intent);
}
}
}
2. AndroidManifest.xml 에 추가
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
전원이 켜지면 WelcomeActivity 가 실행됨.
Android 기반 Kiosk 에서 활용할만하다.
Broadcast Receiver 란?
-
안드로이드 4대 컴포넌트 중 1개다.
-
각종 앱에서 발생하는 방송(이벤트)을 캐치 후 리시버로 처리할 수 있도록 해준다.
-
1. 방송하기 -> 2. 수신하기(방송에 대한 처리), 두 개가 하나의 사이클로 동작된다.
리시버의 종류
정적 리시버
-
한번 등록되면 해제할 수 없다.
-
메니페스트에 리시버를 등록하는 방식으로 정적리시버를 등록한다.
-
해당 앱이 설치될때 자동으로 등록된다.
동적 리시버
-
등록과 해제가 자유롭다.
-
메니페스트에 등록하지않고 소스상에 등록을 한다.
리시버의 동작 제한(인텐트 플래그를 통한)
FLAG_EXCLUDE_STOPPED_PACKAGES
-
앱이 한번이라도 실행됬을때만 리시버가 동작할 수 있도록 해준다.
-
API 12 이후로는 이 플래그는 기본으로 설정된다.
FLAG_INCLUDE_STOPPED_PACKAGES
-
한번도 실해되지 않은 앱이라도 리시버가 동작하게 해준다.
FLAG_RECEIVER_REGISTERD_ONLY
-
오직 동적리시버만 방송받을 수 있도록 해준다.
FLAG_RECEIVER_REPLACE_PENDING
-
동일한 액션으로 중복해서 방송하는 경우 중복된 방송을 제거해준다.
리시버 동작시간 제한
리시버에서도 액티비티와 마찬가지로 작업시간이 제한되어있다. (메인스레드에서 동작하므로)
백그라운드 리시버 : 60초
포그라운드 리시버: 10초
리시버 호출 및 우선순위
-
정적리시버는 절대 동시에 실행되지 않고 한개씩 처리한다.
-
정적리시버는 앱이 먼저 설치된 우선순위로 실행된다.
-
동적리시버는 동시에 실행된다.(우선순위가 중요하지않다.)
-
동적리시버는 리시버가 작성된 컴포넌트가 종료되면 동작하지 않는다.(사실 onDestroy()함수에 unregister(receiver)를 통해서 리시버를 해제하지 않으면 동작하는데 그러면 메모리 누수가 발행하므로 꼭 해준다)
-
방송할때 인텐트필터의 setPriority(1)함수로 우선순위를 조작할 수 있다. (클수록 우선, 동적리시버는 우선순위가 중요하지않음)
-
정적리시버의 우선순위는 메니페스트의 인텐트필터요소에서만 설정가능하다. ( <intent-filter android:priority="1"> .. )
-
sendBroadcast()대신 sendOrderBroadcast()를 사용하면 동적리시버에서도 우선순위를 적용해서 처리할 수 있다.
-
setPackage()함수로 원하는 패키지의 리시버만 동작하도록 방송할 수 있다.