안드로이드

[안드로이드/Android] 안드로이드 앱 아이콘 동적 변경하기

알통몬_ 2023. 2. 16. 11:33
반응형

삼성 시계 앱을 보면 앱 아이콘에 현재 시간이 표시되고 계속해서 변경되는 것을 확인할 수 있습니다.

어떻게하면 이미 설치된 앱의 아이콘을 동적으로 변경할 수 있을까요?

안드로이드에서 제공하는

PackageManager 를 사용해 변경할 수 있습니다.

1. 먼저 기본 앱 아이콘, 변경할 앱 아이콘을 준비해주세요.

2. MainActivityAlias.kt 라는 클래스를 만들고 일반 액티비티처럼 AppCompatActivity를 상속해주세요.

import androidx.appcompat.app.AppCompatActivity

class MainActivityAlias: AppCompatActivity() {
    
}

3. AndroidManefest.xml 에 아래 값을 추가해주세요.

<activity-alais> 태그를 추가해주시면 됩니다.

android:roundIcon 에는 변경할 round icon 을

android:icon 에는 변경할 icon을 넣어주시면 됩니다.

<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:supportsRtl="true"
    android:theme="@style/Theme.ChangeIconApp"
    tools:targetApi="33">
    <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>
    </activity>

    <activity-alias
        android:exported="true"
        android:name=".MainActivityAlias"
        android:roundIcon="@mipmap/ic_launcher_client_foreground"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher_client"
        android:enabled="false"
        android:targetActivity=".MainActivity">

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

    </activity-alias>
</application>

4. xml에 버튼을 하나 만듭니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/changeIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="changeIcon"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

5. MainActivity.kt 에서 변경 코드를 작성합니다.

import android.content.ComponentName
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val button = findViewById<Button>(R.id.changeIcon)
        button.setOnClickListener {
            val manager = packageManager
            
            // MainActivity의 컴포넌트의 상태를 가져옵니다.
            val value = manager.getComponentEnabledSetting(ComponentName(
                applicationContext,
                MainActivity::class.java
            ))
            
            // 가져온 상태가 ENABLE 일 경우 DISABLE하고
            // MainActivityAlias의 상태를 ENABLE 해줍니다.
            if(value == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
                manager.setComponentEnabledSetting(
                    ComponentName(
                        applicationContext,
                        MainActivity::class.java
                    ),
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP
                )
                manager.setComponentEnabledSetting(
                    ComponentName(
                        applicationContext,
                        MainActivityAlias::class.java
                    ),
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP

                )
            } else {
	
            // 가져온 상태가 DISABLE 일 경우 EABLE하고
            // MainActivity의 상태를 ENABLE 해줍니다.
                manager.setComponentEnabledSetting(
                    ComponentName(
                        applicationContext,
                        MainActivity::class.java
                    ),
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP
                )
                manager.setComponentEnabledSetting(
                    ComponentName(
                        applicationContext,
                        MainActivityAlias::class.java
                    ),
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP

                )
            }
        }
    }
}

6. 실행 결과입니다.

 

잘 활용한다면 계절별로 앱의 아이콘을 변경하거나 눈이 올때, 추석, 설 명절 등에 활용할 수 있겠습니다.

프로젝트 코드는 아래 Github에서 확인하실 수 있습니다.

https://github.com/Parksunggyun/ChangeIconApp

반응형