Android

[Android] Broadcast Receiver 를 이용한 App 자동 실행(전원이 켜질때)

EnvEng10 2020. 10. 19. 11:00
반응형

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()함수로 원하는 패키지의 리시버만 동작하도록 방송할 수 있다.

반응형