Foggy day

[Android] Boot App(부트앱) 만들기 본문

Android

[Android] Boot App(부트앱) 만들기

jinhan38 2023. 8. 27. 21:39

이번 포스팅에서는 부트앱을 만들어보겠습니다. 부트앱은 디바이스의 전원이 켜졌을 때 실행되는 앱을 말합니다.

 

 

1. BootApp Reciever 만들기

2. Manifest 설정

3. 권한 요청 

 

 

1. BootApp Reciever 만들기

Boot App을 만들기 위해서는 BroadcastReceiver를 추가해야 합니다. 

디바이스의 전원이 켜지면 onReceive 함수에 진입하게 되고, Intent를 사용해서 원하는 Activity를 실행시킵니다. 그런데 Android OS 10 이상부터는 SYSTEM_ALERT_WINDOW 권한이 필요합니다. BootApp Receiver에서는 Settings.canDrawOverlays 함수를 사용해서 권한이 허용됐는지 아닌지만 체크합니다. 비허용이라면 return 함수를 호출해서 아무것도 하지 않습니다. 권한 요청은 MainActivity에서 진행할 예정입니다. Overlays 권한 체크 함수가 API level 23 이상부터 사용 가능하기 때문에 API 레벨 체크 로직 또한 추가했습니다. 

 

- BootApp

class BootApp : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {

        if (intent != null && context != null && intent.action == Intent.ACTION_BOOT_COMPLETED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) {
                return
            }

            val i = Intent(context, MainActivity::class.java)
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            context.startActivity(i)
        }

    }
}

 

 

2. Manifest 설정

Manifest에서는 필요한 권한과 앞서 만든 receiver를 추가하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!--부트앱을 위한 퍼미션-->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <!--시스템 오버레이 설정(다른 앱 위에 표시) Android OS 10 이상부터 부트앱을 위해서 필요함-->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Boot_app_android"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>

        <!--부트앱을 위한 receiver 추가-->
        <receiver
            android:name=".BootApp"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>

        </receiver>
    </application>

</manifest>

 

 

 

3. 권한 요청 

MainActivity에서 SYSTEM_ALERT_WINDOW 권한을 요청하겠습니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                val uri: Uri = Uri.parse("package:$packageName")
                val i = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, uri)
                startActivity(i)
            }
        }
    }
}

 

 

 

앞선 조건들이 충족된다면 디바이스의 전원이 켜졌을 때 잠시 후 앱이 실행되는 것을 볼 수 있습니다. 

 

소스코드

https://github.com/jinhan38/boot_app_android