반응형
삼성 시계 앱을 보면 앱 아이콘에 현재 시간이 표시되고 계속해서 변경되는 것을 확인할 수 있습니다.
어떻게하면 이미 설치된 앱의 아이콘을 동적으로 변경할 수 있을까요?
안드로이드에서 제공하는
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에서 확인하실 수 있습니다.
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드/Android] Migration SharedPreferences to EncryptedSharedPreferences (0) | 2023.03.14 |
---|---|
[Android Compose] 안드로이드 컴포즈에서 Glide 호출하기 (0) | 2023.02.20 |
[안드로이드/Android] Parcelable 과 Serializable (0) | 2023.02.15 |
[안드로이드/Android] WebRTC PeerConnection.IceServer() is deprecated. (0) | 2023.02.13 |
[안드로이드/Android] local.properties 활용하기/변수저장하기 (0) | 2023.02.10 |