我想按计划更改应用程序图标如何在 android 中执行此操作

I want to change app icon progrmatically how to do it in android

提问人:Devendra Joshi 提问时间:11/1/2023 更新时间:11/1/2023 访问量:46

问:

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

    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 包管理器 appicon android-activity-alias

评论


答:

1赞 ΓDΛ 11/1/2023 #1

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

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

清单 .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))
    }
}