Wie ändere ich ein Anwendungssymbol programmgesteuert in Android?

153

Ist es möglich, ein Anwendungssymbol direkt aus dem Programm heraus zu ändern?
Ich meine, ändern Sie icon.pngden res\drawableOrdner.
Ich möchte, dass Benutzer das Anwendungssymbol aus dem Programm ändern können, damit sie das nächste Mal das zuvor ausgewählte Symbol im Launcher sehen.

systempuntoout
quelle

Antworten:

79

Es ist eine alte Frage, aber immer noch aktiv, da es keine explizite Android-Funktion gibt. Und die Jungs von Facebook haben eine Lösung gefunden - irgendwie. Heute habe ich einen Weg gefunden, der für mich funktioniert. Nicht perfekt (siehe Anmerkungen am Ende dieser Antwort), aber es funktioniert!

Die Hauptidee ist, dass ich das Symbol der Verknüpfung meiner App aktualisiere, die vom Launcher auf meinem Startbildschirm erstellt wurde. Wenn ich etwas am Verknüpfungssymbol ändern möchte, entferne ich es zuerst und erstelle es mit einer neuen Bitmap neu.

Hier ist der Code. Es hat einen Knopf increment. Wenn diese Taste gedrückt wird, wird die Verknüpfung durch eine Verknüpfung mit einer neuen Zählnummer ersetzt.

Zuerst benötigen Sie diese beiden Berechtigungen in Ihrem Manifest:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

Dann benötigen Sie diese beiden Methoden zum Installieren und Deinstallieren von Verknüpfungen. Die shortcutAddMethode erstellt eine Bitmap mit einer Nummer. Dies soll nur zeigen, dass es sich tatsächlich ändert. Sie möchten diesen Teil wahrscheinlich mit etwas ändern, das Sie in Ihrer App möchten.

private void shortcutAdd(String name, int number) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Create bitmap with number in it -> very default. You probably want to give it a more stylish look
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    Paint paint = new Paint();
    paint.setColor(0xFF808080); // gray
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTextSize(50);
    new Canvas(bitmap).drawText(""+number, 50, 50, paint);
    ((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);

    // Decorate the shortcut
    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);

    // Inform launcher to create shortcut
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

private void shortcutDel(String name) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Decorate the shortcut
    Intent delIntent = new Intent();
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);

    // Inform launcher to remove shortcut
    delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(delIntent);
}

Und schließlich sind hier zwei Listener, die die erste Verknüpfung hinzufügen und die Verknüpfung mit einem inkrementierenden Zähler aktualisieren.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.test);
    findViewById(R.id.add).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutAdd("changeIt!", count);
        }
    });
    findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutDel("changeIt!");
            count++;
            shortcutAdd("changeIt!", count);
        }
    });
}

Bemerkungen:

  • Diese Methode funktioniert auch, wenn Ihre App mehr Verknüpfungen auf dem Startbildschirm steuert, z. B. mit verschiedenen Extras im Intent. Sie benötigen nur unterschiedliche Namen, damit der richtige deinstalliert und neu installiert wird.

  • Die programmatische Behandlung von Verknüpfungen in Android ist eine bekannte, weit verbreitete, aber nicht offiziell unterstützte Android-Funktion. Es scheint auf dem Standard-Launcher zu funktionieren und ich habe es nirgendwo anders versucht. Also beschuldigen Sie mich nicht, wenn Sie diese Benutzer-E-Mails erhalten. "Es funktioniert nicht auf meinem XYZ-Telefon mit doppelter Wurzel und Super-Explosion."

  • Der Launcher schreibt eine, Toastwenn eine Verknüpfung installiert wurde, und eine, wenn eine Verknüpfung deinstalliert wurde. So bekomme ich Toastjedes Mal zwei s, wenn ich das Symbol ändere. Das ist nicht perfekt, aber gut, solange der Rest meiner App perfekt ist ...

jboi
quelle
9
Die heutige Kalender-App ändert täglich Symbole ohne Toast.
Jim McKeeth
1
@ Jim (ich denke) das ist dann eigentlich ein Widget
JacksOnF1re
3
shortcutDel funktioniert leider nicht mehr in Marshmallow, siehe auch stackoverflow.com/a/33731620/1545993
Taifun
2
Dies ersetzt das Verknüpfungssymbol und nicht das
Startsymbol
3
Was ist in den folgenden Zeilen Play.class und Constants.ACTION_PLAY Intent shortcutIntent = new Intent (getApplicationContext (), Play.class); shortcutIntent.setAction (Constants.ACTION_PLAY);
Dasharath Singh Bajroliya
136

Versuchen Sie dies, es funktioniert gut für mich:

1. Ändern Sie IhreMainActivity Abschnitt in AndroidManifest.xml, löschen Sie ihn, Zeile mit MAINKategorie in intent-filterAbschnitt

<activity android:name="ru.quickmessage.pa.MainActivity"
    android:configChanges="keyboardHidden|orientation"
    android:screenOrientation="portrait"
    android:label="@string/app_name"
    android:theme="@style/CustomTheme"
    android:launchMode="singleTask">
    <intent-filter>
        ==> <action android:name="android.intent.action.MAIN" /> <== Delete this line
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2. Erstellen Sie <activity-alias>für jedes Ihrer Symbole. So was

<activity-alias android:label="@string/app_name" 
    android:icon="@drawable/icon" 
    android:name=".MainActivity-Red"
    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>

3 . Programmgesteuert festlegen: Legen Sie das ENABLE-Attribut für das entsprechende Attribut festactivity-alias

 getPackageManager().setComponentEnabledSetting(
        new ComponentName("ru.quickmessage.pa", "ru.quickmessage.pa.MainActivity-Red"), 
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Hinweis: Es muss immer mindestens eine aktiviert sein.

PA
quelle
3
Funktioniert leider auf allen Geräten, die ich anprobiert habe, unterschiedlich. Funktioniert auf dem HTC Desire 2.2, ist jedoch auf dem Galaxy Nexus 4.2.2 und dem Nexus 7 4.3 unzuverlässig. Auf dem Galaxy Nexus können alle Symbole für die App verschwinden und auch alle Widgets entfernt werden. Schade, also musste ich diese Funktionalität auf späteren Geräten entfernen.
Richard Le Mesurier
7
Ich kann meine App nicht starten, da ich Folgendes gelöscht habe: <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" />
noobProgrammer
1
Dies funktioniert perfekt für mich, wenn ich zwischen Startsymbolen in der Taskleiste und auf dem Startbildschirm wechsle. Ich habe jedoch festgestellt, dass das auf Betriebssystemebene verwendete Symbol (z. B. für Multitasking, Popup zur Deinstallation oder in der Application Manager-Liste) erhalten bleibt Das Original oder wird zum generischen Standard-Android-Symbol, wenn Sie im Manifest kein Anwendungssymbol auf Anwendungsebene festgelegt haben. Haben Sie eine Lösung dafür gefunden oder tolerieren Sie nur eine Nichtübereinstimmung (oder Abwesenheit) des Symbols auf Betriebssystemebene?
Jokeefe
2
Fehler beim Ausführen der App. Standardaktivität nicht gefunden.
CopsOnRoad
1
Fehler beim Ausführen der App. Standardaktivität nicht gefunden
Kamil Ibadov
36

Sie können das Manifest oder die Ressource in der signierten und versiegelten APK nur durch ein Software-Upgrade ändern.

CommonsWare
quelle
2
@Nanne: Dies ist ein App-Widget oder eine Startbildschirmfunktion, kein Anwendungssymbol. Sie können das Manifest oder eine Ressource nur über ein Software-Upgrade ändern.
CommonsWare
1
? Nein, ich meine umgekehrt: Es ist kein Widget (beworben als). Ich füge es als App-Verknüpfung hinzu. Aber, wie Sie sagen, nur weil dieses nicht auf Lager befindliche Zeug impliziert, dass es nur eine Ikone ist, heißt das nicht, dass es das ist :)
Nanne
2
@NeTeInStEiN: Es funktioniert nicht für alle Startbildschirme (z. B. diejenigen, die nicht auf komponentenfähige Änderungen achten).
CommonsWare
1
Nicht mehr wahr. Google Kalender auf Android 6+ ändert sich täglich im Launcher. Heute ist das Symbol eine "2", gestern war es eine "1". Normalerweise war auf dem Symbol eine "31". Aber nicht mehr, es ändert sich. Weiß jemand wie das möglich ist?
UeliDeSchwert
1
@Bobby: Ich meine, dass es im Play Store Hunderte, wenn nicht Tausende von Startbildschirmimplementierungen gibt, zusätzlich zu den Hunderten verschiedener vorinstallierter Startbildschirme in den Tausenden von existierenden Android-Gerätemodellen. Diese Startbildschirmimplementierungen können über Hooks verfügen, die das Ersetzen von dynamischen Startsymbolen ermöglichen. Dies müssen jedoch nicht alle Startbildschirme bieten. Nur weil Sie dieses Verhalten für eine App auf einem Startbildschirm auf einem Gerät sehen, bedeutet dies nicht, dass es für alle Apps auf allen Startbildschirmen auf allen Geräten verfügbar ist.
CommonsWare
17

Programmgesteuert möchten Sie den Anwendungsstarter möglicherweise selbst veröffentlichen:

Hinweis: Diese Methode funktioniert ab Android 8.0 - Oreo nicht mehr

Fügen Sie in Ihrer AndroidManifest.xml Folgendes hinzu:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>

Dann müssen Sie Ihre App Launcher-Absicht erstellen:

Intent myLauncherIntent = new Intent();
myLauncherIntent.setClassName("your.package.name", "YourLauncherActivityName");
myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Erstellen Sie eine Installationsverknüpfungsabsicht mit Ihrem App-Starter und dem benutzerdefinierten Symbol:

Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myLauncherIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Application Name");
intent.putExtra
       (
        Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
        Intent.ShortcutIconResource.fromContext
                                    (
                                         getApplicationContext(), 
                                         R.drawable.app_icon
                                    )
       );
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

Und schließlich starten Sie die Sendungsabsicht:

getApplicationContext().sendBroadcast(intent);
Andrei Marcut
quelle
Dies ersetzt das Verknüpfungssymbol, nicht das
Startsymbol
10

Angenommen, Sie möchten das auf dem Startbildschirm angezeigte Symbol ändern, können Sie dies einfach tun, indem Sie ein Widget erstellen, das genau dies tut. Hier ist ein Artikel, der zeigt, wie dies für eine Anwendung vom Typ "Neue Nachrichten" ähnlich dem iPhone erreicht werden kann:

http://www.cnet.com/8301-19736_1-10278814-251.html

Marius Kjeldahl
quelle
9

Die Lösung von @ PA funktioniert teilweise für mich. Detaillierte meine Ergebnisse unten:

1) Das erste Code-Snippet ist falsch, siehe unten:

<activity
    ...
    <intent-filter>
        ==> <action android:name="android.intent.action.MAIN" /> <== This line shouldn't be deleted, otherwise will have compile error
        <category android:name="android.intent.category.LAUNCHER" /> //DELETE THIS LINE
    </intent-filter>
</activity>

2) Verwenden Sie den folgenden Code, um alle Symbole zu deaktivieren, bevor Sie ein anderes aktivieren. Andernfalls wird ein neues Symbol hinzugefügt, anstatt es zu ersetzen.

getPackageManager().setComponentEnabledSetting(
        getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

ABER, wenn Sie den obigen Code verwenden, wird die Verknüpfung auf dem Homescreen entfernt! Und es wird nicht automatisch wieder hinzugefügt. Möglicherweise können Sie das Symbol programmgesteuert wieder hinzufügen, aber es bleibt wahrscheinlich nicht an der gleichen Position wie zuvor.

3) Beachten Sie, dass das Symbol nicht sofort geändert wird. Dies kann einige Sekunden dauern. Wenn Sie direkt nach dem Ändern darauf klicken, wird möglicherweise die Fehlermeldung "App ist nicht installiert" angezeigt.

Daher ist diese Lösung meiner Meinung nach nur zum Ändern des Symbols im App Launcher geeignet, nicht für Verknüpfungen (dh das Symbol auf dem Homescreen).

Deqing
quelle
2
Fehler beim Ausführen der App. Standardaktivität nicht gefunden.
CopsOnRoad
Wenn Sie den Launcher löschen, wie wird die Standardaktivität @Deqing gefunden?
j2emanue
5

Versuchen Sie diese Lösung

<activity android:name=".SplashActivity"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity-alias android:label="ShortCut"
        android:icon="@drawable/ic_short_cut"
        android:name=".SplashActivityAlias"
        android:enabled="false"
        android:targetActivity=".SplashActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

Fügen Sie den folgenden Code hinzu, wenn Sie Ihr App-Symbol ändern möchten

PackageManager pm = getPackageManager();
                    pm.setComponentEnabledSetting(
                            new ComponentName(YourActivity.this,
                                    "your_package_name.SplashActivity"),
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                            PackageManager.DONT_KILL_APP);

                    pm.setComponentEnabledSetting(
                            new ComponentName(YourActivity.this,
                                    "your_package_name.SplashActivityAlias"),
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
Faxriddin Abdullayev
quelle
4

AndroidManifest.xml Beispiel:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="com.pritesh.resourceidentifierexample.MainActivity"
                  android:label="@string/app_name"
                  android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <!--<category android:name="android.intent.category.LAUNCHER"/>-->
            </intent-filter>
        </activity>

        <activity-alias android:label="RED"
                        android:icon="@drawable/ic_android_red"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Red"
                        android:enabled="true"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="GREEN"
                        android:icon="@drawable/ic_android_green"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Green"
                        android:enabled="false"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="BLUE"
                        android:icon="@drawable/ic_android_blue"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Blue"
                        android:enabled="false"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

    </application>

Folgen Sie dann dem unten angegebenen Code in MainActivity:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
            int imageResourceId;
            String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
            int hours = new Time(System.currentTimeMillis()).getHours();
            Log.d("DATE", "onCreate: "  + hours);

            getPackageManager().setComponentEnabledSetting(
                    getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

            if(hours == 13)
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_red", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Red"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
            }else if(hours == 14)
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_green", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Green"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

            }else
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_blue", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Blue"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

            }

            imageView.setImageResource(imageResourceId);
Pritesh Patel
quelle
Ich bekomme eine com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexampleAusnahme. Hier habe ich Ihren Manifestnamen nur verwendet, um mein Problem zu demonstrieren
Tejas Pandya
0

Um die Lösung von Markus zum Laufen zu bringen, brauchte ich die erste Absicht:

Intent myLauncherIntent = new Intent(Intent.ACTION_MAIN);
            myLauncherIntent.setClassName(this,  this.getClass().getName());
            myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PuZZleDucK
quelle
0

Bei Anwendung der genannten Vorschläge habe ich das Problem, dass die App getötet wird, wenn das Standardsymbol in ein neues Symbol geändert wird. Habe also den Code mit ein paar Tweaks implementiert. Schritt 1). Erstellen Sie in der Datei AndroidManifest.xml für die Standardaktivität mit android: enabled = "true" und anderen Alias ​​mit android: enabled = "false". Sie werden diese nicht mit android anhängen, sondern anhängen: enabled = "true".

       <activity
        android:name=".activities.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">

    </activity>
    <!-- <activity-alias used to change app icon dynamically>   : default icon, set enabled true    -->
    <activity-alias
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:name=".SplashActivityAlias1" <!--put any random name started with dot-->
        android:enabled="true"
        android:targetActivity=".activities.SplashActivity"> <!--target activity class path will be same for all alias-->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>
    <!-- <activity-alias used to change app icon dynamically>  : sale icon, set enabled false initially -->
    <activity-alias
        android:label="@string/app_name"
        android:icon="@drawable/ic_store_marker"
        android:roundIcon="@drawable/ic_store_marker"
        android:name=".SplashActivityAlias" <!--put any random name started with dot-->
        android:enabled="false"
        android:targetActivity=".activities.SplashActivity"> <!--target activity class path will be same for all alias-->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

Schritt 2). Erstellen Sie eine Methode, mit der der erste Aktivitätsalias mit dem Standardsymbol deaktiviert und der zweite Alias ​​mit dem Symbol aktiviert werden muss.

/**
 * method to change the app icon dynamically
 *
 * @param context
 * @param isNewIcon  : true if new icon need to be set; false to set default 
 * icon
 */

public static void changeAppIconDynamically(Context context, boolean isNewIcon) {
    PackageManager pm = context.getApplicationContext().getPackageManager();
    if (isNewIcon) {
        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias1"), //com.example.dummy will be your package
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    } else {
        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias1"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }
}

Schritt 3). Rufen Sie diese Methode nun je nach Ihren Anforderungen auf, z. B. beim Klicken auf eine Schaltfläche oder bei datumsspezifischen oder anlassspezifischen Bedingungen.

// Switch app icon to new icon
    GeneralUtils.changeAppIconDynamically(EditProfileActivity.this, true);
// Switch app icon to default icon
            GeneralUtils.changeAppIconDynamically(EditProfileActivity.this, false);

Ich hoffe, dies hilft denjenigen, die mit dem Problem konfrontiert sind, dass die App beim Symbolwechsel getötet wird. Viel Spaß beim Codieren :)

Abhijeet
quelle