我想以编程方式更改应用程序图标如何在android中做到这一点

问题描述 投票:0回答:1

我使用下面的代码以编程方式更改应用程序图标。但当我们第一次更改图标时,它就会杀死该应用程序。如何在更改应用程序图标时避免杀死应用程序。

    PackageManager packageManager = getPackageManager();
    packageManager.setComponentEnabledSetting(new ComponentName("package name", "class name"),
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);

    //enables the second icon
    packageManager.setComponentEnabledSetting(new ComponentName("package name", "class alias"),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
android android-manifest package-managers appicon android-activity-alias
1个回答
0
投票

不幸的是,应用程序必须

kill
。但作为替代方案,我可以提出以下建议。您可以在应用程序关闭后更改它。

您可以通过服务来实现这一点。

Manifest.xml

<activity-alias
    android:name=".one"
    android:icon="@mipmap/ic_launcher_one"
    android:targetActivity=".ui.MainActivity"
    android:enabled="true">

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

</activity-alias>

<activity-alias
    android:name=".two"
    android:icon="@mipmap/ic_launcher_two"
    android:targetActivity=".ui.MainActivity"
    android:enabled="false">

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

</activity-alias>

服务.kt

class AppIconChangeService: Service() {
    private val aliases = arrayOf(".one", ".two")

    override fun onBind(intent: Intent?): IBinder? = null

    override fun onTaskRemoved(rootIntent: Intent?) {
        changeAppIcon()
        stopSelf()
    }

    fun changeAppIcon() {
        val sp = getSharedPreferences("appSettings", Context.MODE_PRIVATE)

        sp.getString("activeActivityAlias", ".one").let { aliasName ->
            if (!isAliasEnabled(aliasName)) {
                setAliasEnabled(aliasName)
            }
        }
    }

    private fun isAliasEnabled(aliasName: String): Boolean {
        return packageManager.getComponentEnabledSetting(
            ComponentName(
                this,
                "${BuildConfig.APPLICATION_ID}$aliasName"
            )
        ) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED
    }

    private fun setAliasEnabled(aliasName: String) {
        aliases.forEach {
            val action = if (it == aliasName)
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED
            else
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                
            packageManager.setComponentEnabledSetting(
                ComponentName(
                    this,
                    "${BuildConfig.APPLICATION_ID}$aliasName"
                ),
                action,
                PackageManager.DONT_KILL_APP
            )
        }
    }
}

添加服务清单

<service 
    android:name=".AppIconChangeService"
    android:stopWithTask="false"
    />

新增服务

class MainActivity: Activity {
    override fun onCreate(savedInstanceState: Bundle?) {
       startService(Intent(this, ChangeAppIconService::class.java))
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.