android应用icon动态更换

来源:互联网 发布:win10网络连接 编辑:程序博客网 时间:2024/04/29 15:23

1.      动态更换应用Icon

原理 1 ---activity-alias

在AndroidManifest.xml 中,有两个属性:

            <intent-filter>

                 // 决定应用程序最新启动的activity

                <action android:name="android.intent.action.MAIN" />

                 // 决定应用程序是否显示在程序列表

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口,可以参考系统setting和launcher系统源码。

 

  原理2 --- PM.setComponentEnabledSetting

PackageManager是一个大统领类,可以管理所有的系统组件,如果root后,还可以管理其他App的所有组件,一些系统优化工具就是通过这个方式禁用一些后台service的。

 

  使用方式异常简单:

private void enableComponent(ComponentName componentName){

  mPm.setComponentEnabledSetting(componentName,

 PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager. DONT_KILL_APP);

}

 

private void disableComponent(ComponentName componentName){

  mPm.setComponentEnabledSetting(componentName,

 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager. DONT_KILL_APP);

}

 

  以上两个方法控制组件是否启用。

 

  动态更换Icon

 基于上面的两个原理,来实现动态更换Icon。

首先,创建一个Activity,作为默认的入口并带着默认的图片,再创建一个双11的activity-alias,指向默认的Activity并带双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片…等等。

<activity android:name=".MainActivity" >

     <intent-filter >

         <action android:name=" android.intent.action.MAIN " />

         <category android:name=" android.intent.category.LAUNCHER " />

     </intent-filter>

</activity>

 

 <activity-alias

android:name=".Test11"

      android:enabled="false"

      android:label="双11"

      android:icon="@drawable/s11"

      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=".Test12"

      android:enabled="false"

      android:label="双12"

      android:icon="@drawable/s12"

      android:targetActivity=".MainActivity">

      <intent-filter >

        <action android:name=" android.intent.action.MAIN " />

        <category android:name=" android.intent.category.LAUNCHER " />

      </intent-filter>

  </activity-alias>

 

 

  这样配置的话,就可以在Lanucher显示2个入口,所以默认会把这些activity-alias先禁用,等到用时再启用。

如下是应用java代码:

public class MainActivity extends AppCompatActivity{

  private ComponentName mDefault;

  private ComponentName mDouble11;

  private ComponentName mDouble12;

  private PackageManager mPm;

 

  @Override

  protected void onCreate(Bundle savedInstanceState){

  super. onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

 

  mDefault = getComponentName();

  mDouble11 = new ComponentName(getBaseContext(),”com.jxh.Test11”);

  mDouble12 = new ComponentName(getBaseContext(),”com.jxh.Test12”);

  mPm = getApplicationContext().getPackageManager();

 

}

public void changeIcon11(View view){

   disableComponent(mDefault);

   disableComponent(mDouble12);

   enableComponent(mDouble11);

}

public void changeIcon12(View view){

   disableComponent(mDefault);

   disableComponent(mDouble11);

   enableComponent(mDouble12);

}

 

private void enableComponent(ComponentName componentName){

     mPm.setComponentEnabledSetting(componentName,

 PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager. DONT_KILL_APP);

}

private void disableComponent(ComponentName componentName){

    mPm.setComponentEnabledSetting(componentName,

 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager. DONT_KILL_APP);

}

}

  主界面主要是两个按钮,一个双11,一个双12,点击可以调用对应的函数即可。

 

0 0
原创粉丝点击