上次发版我就改了一行代码!

动态更换应用Icon

产品:我们可以动态更换App在Launcher里面的Icon吗
开发:不可以
产品:我们可以动态更换App在Launcher里面的Icon吗
开发:不可以
产品:我们可以动态更换App在Launcher里面的Icon吗
开发:不可以
产品:我们可以动态更换App在Launcher里面的Icon吗
开发:让我想想……

原理1——activity-alias

在AndroidMainifest中,有两个属性:

// 决定应用程序最先启动的Activity
android.intent.action.MAIN 
// 决定应用程序是否显示在程序列表里
android.intent.category.LAUNCHER 

另外,还有一个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);
}

根据PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用。

动态换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:icon="@drawable/s11"
    android:label="双11"
    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:icon="@drawable/s12"
    android:label="双12"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

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

等等,这样有个问题,那就是这样会在Launcher上显示3个入口,所以,默认我们会把这些activity-alias先禁用,等到要用的时候再启用,养兵千日,用兵一时。

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.xys.changeicon.Test11");
        mDouble12 = new ComponentName(
                getBaseContext(),
                "com.xys.changeicon.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);
    }
}

OK了,禁用默认的Activity后,启用双11的activity-alias,结果不变还是指向了默认的Activity,但图标已经发生了改变。

根据ROM的不同,在禁用了组件之后,会等一会,Launcher会自动刷新图标。

效果参考下图。

这里写图片描述

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
### 回答1: VBA中的计时器函数可以用来实现每隔一段时间执行代码的功能。下面是一个使用计时器函数实现每隔一秒执行代码的示例: 首先,在VBA编辑器中打开你想要执行的代码所在的模块。 然后,在模块中声明一个全局的变量来保存上次执行代码的时间: ```vba Dim lastTime As Double ``` 接下来,在你想要执行的代码之前插入以下代码段: ```vba lastTime = Timer ``` 然后,在需要每隔一段时间执行的代码之前插入以下代码段: ```vba ' 如果距离上次执行代码已经过了1秒钟 If Timer - lastTime >= 1 Then ' 执行你的代码 ' 更新上次执行代码的时间 lastTime = Timer End If ``` 最后,你可以将以上的代码段放到一个循环结构中,以实现不断重复执行的效果: ```vba Do While True ' 如果距离上次执行代码已经过了1秒钟 If Timer - lastTime >= 1 Then ' 执行你的代码 ' 更新上次执行代码的时间 lastTime = Timer End If ' 等待一段时间,避免代码执行过快 Application.Wait (Now + TimeValue("0:00:01")) Loop ``` 这样,每隔一秒钟就会执行你所指定的代码。你可以根据自己的需求修改时间间隔或者执行的代码。同时,请注意这种方式可能会导致VBA编辑器在代码运行期间无法响应其他操作,因此请在必要时慎重使用。 ### 回答2: VBA可以使用定时器来实现每隔一段时间执行代码的功能。我们可以使用Application对象的OnTime方法来实现定时执行。 首先,我们需要在VBA编辑器中打开所需的VBA模块。然后,在想要执行的代码之前,添加以下代码行: Dim timeValue As Variant timeValue = Now + TimeValue("00:01:00") '设置每隔1分钟执行一次代码 Application.OnTime timeValue, "MacroName" '将"MacroName"替换为你的宏名称 上述代码将在当前时间的1分钟后执行指定的宏(即"MacroName")。执行后,代码再次设置下一次执行时间,以此循环。 接下来,我们需要创建一个宏来执行我们想要定时执行的代码。在同一VBA模块中,添加以下代码行: Sub MacroName() '在这里写下需要定时执行的代码 '例如: MsgBox "Hello, VBA!" End Sub 在上述示例中,我们在定时执行的宏中添加了一个消息框,显示"Hello, VBA!"。 然后,我们可以运行这个宏(按下F5),以便在第一次设置的时间之后立即执行。 这样,每隔一分钟,定时器都会调用指定的宏,从而执行我们想要定时执行的代码。请确保在代码中设置合适的时间间隔,以满足你的需求。 如果需要取消定时执行代码,可以使用以下代码行: Application.OnTime EarliestTime:=timeValue, Procedure:="MacroName", Schedule:=False 这样就可以取消后续的定时执行。 ### 回答3: 在VBA中,可以使用Application.OnTime方法来实现定时执行代码的功能。该方法接受两个参数,一个是指定执行代码的时间,另一个是要执行的代码。下面是一个示例: ```vba Sub ExecuteCodePeriodically() ' 设置每隔5秒执行一次代码 Application.OnTime Now + TimeValue("00:00:05"), "MyMacro" End Sub Sub MyMacro() ' 在这里写你要执行的代码 MsgBox "Hello, World!" ' 设置继续每隔5秒执行一次代码 Application.OnTime Now + TimeValue("00:00:05"), "MyMacro" End Sub ``` 在上面的例子中,首先定义了一个名为ExecuteCodePeriodically的子过程,用于设置每隔5秒执行一次代码。在这个子过程中,通过调用Application.OnTime方法设置了下一次执行代码的时间和执行的代码名称。 另外,在MyMacro子过程中写入了你要执行的代码,这里使用了MsgBox函数弹出一个弹窗,显示"Hello, World!"。之后又通过Application.OnTime方法设置了下一次执行代码的时间和执行的代码名称,实现了代码的循环执行。 你可以根据自己的需要,将时间间隔和要执行的代码进行修改。需要注意的是,如果想要取消定时执行,可以使用Application.OnTime方法,并将第一个参数设为False,第二个参数设为要取消执行的代码名称。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值