Android动态改变Icon总结笔记

来源:互联网 发布:51单片机编程软件 编辑:程序博客网 时间:2024/06/06 13:22

Android 应用图标动态改变

前提: 程序开发中,有很多需要改变应用桌面图标的场景,比如日历程序图标显示日期、时钟程序图标显示时间信息、社交程序图标显示未读消息数等等, 但是厂商为保证桌面Launcher程序的流畅性,一般都不会对外开放相关接口,使得这类需求的开发变得很困难,本文的期望 就是能够为这类开发提供一些方案。

通过动态改变程序入口组件来改变桌面图标

  1. 配置Activity图标

    Android应用程序可以通过在manifest清单文件中配置Activity组件,来设置程序的入口, icon即是桌面显示的图标,默认情况下参数enable为true,会在桌面显示该图标,若设置enable=false,即该图标不会在桌面显示。

        <activity       android:name=".MainActivity"       android:enabled="false"       android:icon="@mipmap/icon_1">       <intent-filter>         <action android:name="android.intent.action.MAIN" />         <category android:name="android.intent.category.LAUNCHER" />       </intent-filter>    </activity>

    一个程序可以配置多个category为LAUNCHER的activity,从而达到显示多个应用图标的效果,每个图标都是程序的一个入口,点击后显示的界面都不一样。

  2. 给Activity设置引用

    Android可以配置多个activity-alias标签 来为指定activity设置多个引用,每个activity-alias标签都可以icon、label属性来设置图标、标题等信息,同Activity一样,category配置为LAUNCHER时, 且enable为true时,会在系统桌面生成图标。targetActivity指定点击图标后响应的Activity。 name属性为activity-alias唯一标识,java代码中通过该参数获得该activity引用。

    如下配置中,为Activity设置两个引用,又因为只有withIcon1的enable为true,因此,只有该图标会显示在应用程序列表中。
    <activity    android:name=".MainActivity"    android:enabled="false"></activity><activity-alias    android:name="mainActivity.withIcon1"    android:enabled="true"    android:icon="@mipmap/icon_1"    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:name="mainActivity.withIcon2"    android:enabled="false"    android:icon="@mipmap/icon_2"    android:targetActivity=".MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity-alias>
  3. 动态禁用或启用组件

    在java代码中,可以通过ClassName来判断当前处于哪一个组件, 如下代码, 获得的mClassName即是在清单文件为activity或activity-alias配置的name属性。

    String mClassName = getComponentName().getClassName();

    得到程序的PackageManager,禁止或启动的组件,即是重新设置activity或activity-alias的enable属性。组件禁止后该图标从应用程序列表消失,组件启动后应用程序列表显示该图标。

    PackageManager pm = getPackageManager();pm.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);pm.setComponentEnabledSetting(new ComponentName(this, className), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
  4. 总结

    通过预先设置activity的引用,可以简单的显示动态改变程序显示图标的作用, 但是这样做有两个问题:

    1. 程序能有显示icon数量有限,而且必须写死在程序中,不能真正的动态改变
    2. 程序禁止或启动组件的操作进行后,需等待10秒左右的时间(具体时间跟当前系统Launcher策略有关),桌面Launcher才会更新图标

(未完待续。。。)


PS: 这是改变图标的第一钟方法,在部分系统中, 厂商可能会提供相关接口,来部分改变图标,如在图标上显示未读消息数等,有待研究

0 0
原创粉丝点击