Android runtime sırasında, uygulama ismi ve ikonu değiştirmek

Muhammed Kemal Patır
ÇSTech
Published in
3 min readDec 20, 2022
Photo by Denny Müller on Unsplash

Bu yazıda uygulama paylaşmadan, runtime sırasında uygulama ismini veya uygulama ikonunu değiştirmeyi inceleyeceğiz.

Belki sizin de aklınıza takılmıştır, uygulama çalışır durumdayken ismini veya ikonunu değiştirebilir miyiz diye. Ben de bu konuyu merak ettim ve daha önce duyduğum ama inceleyip kullanmadığım <activity-alias> hakkında bir yazı yazmaya karar verdim.

Neden böyle bir şeye ihtiyaç duyabiliriz ?

Bazı özel durumlarda veya özel günlerde, uygulamaya yeni güncelleme vermeden uygulama ismini veya ikonunu değiştirmek isteyebiliriz. Daha sonra bu yaptığımız değişikliği yine güncelleme vermeden geri almak isteyebiliriz. Örnek vermek gerekirse, e-ticaret uygulamalarında, belirli özel indirim günlerinde uygulama ikonunu değiştirip kullanıcının ilgisini çekmek isteyebiliriz. Kullanıcı bir şeye bakmak için telefonunu aldığında, uygulamamızın ikonundaki veya ismindeki değişikliği fark edip uygulamamıza bakmak isteyebilir. Bu şekilde uygulamamızın kullanım trafiğini, alışveriş trafiğini bile artırabiliriz.

<activity-alias> tag’ini biraz inceleyelim.

<activity-alias> tag’ini Android Manifest dosyamızın içine yazarak kullanırız. Bağlı bulunacağı <activity>’den sonra yazmalıyız. <activity> içerisinde kullandığımız <intent-filter> tag’ini de <activity-alias> içerisinde kullanacağız. Şimdi bazı özelliklerini inceleyelim.

android:enabled
Aktif olmasını istediğimiz <activity-alias>’ı belirtmek için kullanırız. Varsayılan değeri “true” olarak gelir. Yalnızca bir <activity-alias>’ın enabled değeri true olmalıdır, birden fazla true değer olduğu durumda birden fazla uygulama ikonu olacaktır.

android:icon
Kullanıcının görmesini istediğimiz ikonu belirtiriz.

android:label
Kullanıcının görmesini istediğimiz uygulama ismimizi belirtiriz.

android:targetActivity
<activity-alias>’ın bağlı bulunacağı activity’i belirtmek için kullanırız.

Şuna benzer bir manifest dosyamız olacak.

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

<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.DynamicIconName"
tools:targetApi="31">

<activity
android:name=".MainActivity"
android:exported="true" />

<activity-alias
android:enabled="false"
android:exported="true"
android:icon="@mipmap/icon_one"
android:label="Name 1"
android:name=".MainActivity.AliasOne"
android:targetActivity=".MainActivity">

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

</activity-alias>

<activity-alias
android:enabled="true"
android:exported="true"
android:icon="@mipmap/icon_two"
android:label="Name 2"
android:name=".MainActivity.AliasTwo"
android:targetActivity=".MainActivity">

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

</activity-alias>

<activity-alias
android:enabled="false"
android:exported="true"
android:icon="@mipmap/icon_three"
android:label="Name 3"
android:name=".MainActivity.AliasThree"
android:targetActivity=".MainActivity">

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

</activity-alias>

</application>

</manifest>

MainActivity içerisinde <intent-filter> belirtmedik. Eğer MainActivity içerisinde de <intent-filter> belirtirsek birden fazla launcher ile karşılaşırız. <activity-alias>’lardan bir tanesinin enabled değerini true yaptık, diğerlerini false yaptık. Uygulamamız yüklendiğinde bu aktif olan alias’ta bulunan ikonu ve ismi göreceğiz.

Şimdi de aktif <activity-alias>’ı değiştireceğimiz kodu yazalım.

MainActivity içerisine aşağıdaki gibi bir fonksiyon ekliyoruz.

    private fun changeAlias(index: Int) {
if (index in 0..2) {
val aliasList = listOf(
ComponentName(BuildConfig.APPLICATION_ID, "${BuildConfig.APPLICATION_ID}.MainActivity.AliasOne"),
ComponentName(BuildConfig.APPLICATION_ID, "${BuildConfig.APPLICATION_ID}.MainActivity.AliasTwo"),
ComponentName(BuildConfig.APPLICATION_ID, "${BuildConfig.APPLICATION_ID}.MainActivity.AliasThree")
)
val indexList = listOf(0, 1, 2).filter { it != index }
packageManager.setComponentEnabledSetting(aliasList[index], PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
packageManager.setComponentEnabledSetting(aliasList[indexList[0]], PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
packageManager.setComponentEnabledSetting(aliasList[indexList[1]], PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
} else {
Toast.makeText(this, "Wrong index", Toast.LENGTH_LONG).show()
}
}

<activity-alias>’lardan oluşan bi liste yaptık. Daha sonra listenin index’lerinden oluşan bir liste daha yaptık ve fonksiyona göndermiş olduğumuz index’teki <activity-alias>’ı aktif, diğerlerini ise pasif yaptık.

Burada unutmamamız gereken bir konu var. <activity-alias> tag’inden bahsederken de değindiğimiz gibi sadece bir tane aktif <activity-alias> olmalıdır, yoksa birden fazla launcher ile karşılaşırız.

<activity-alias> tag’i için diğer detaylara buradan ulaşabilirsiniz

--

--