资讯专栏INFORMATION COLUMN

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

SolomonXie / 1286人阅读

摘要:使用方式异常简单根据和这两个标志量和对应的,就可以控制一个组件的是否启用。动态换有了上面的两个原理,来实现动态更换就只剩下思路问题了。根据的不同,在禁用了组件之后,会等一会,会自动刷新图标。

动态更换应用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的图片……等等等。


    
        

        
    



    
        

        
    



    
        

        
    

等等,这样有个问题,那就是这样会在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会自动刷新图标。

效果参考下图。

更多内容请关注我的微信公众号:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13416.html

相关文章

  • 黑科技实验室 - 收藏集 - 掘金

    摘要:我们团队在屏幕直播方案掘金项目需求是实时同步手机屏幕画面至浏览器。由于引入了对框架的重大改进,因此只有通过支持库的让所有以上的设上如何实现矩形区域截屏掘金对屏幕进行截屏并裁剪有两种方式早截图和晚截图。 从框架层分析如何启动未注册的 Activity - Android - 掘金本文关键词:Binder、AMS、ActivityThread、Handler、Java 反射 引言要解决这个...

    Clect 评论0 收藏0
  • 黑科技实验室 - 收藏集 - 掘金

    摘要:我们团队在屏幕直播方案掘金项目需求是实时同步手机屏幕画面至浏览器。由于引入了对框架的重大改进,因此只有通过支持库的让所有以上的设上如何实现矩形区域截屏掘金对屏幕进行截屏并裁剪有两种方式早截图和晚截图。 从框架层分析如何启动未注册的 Activity - Android - 掘金本文关键词:Binder、AMS、ActivityThread、Handler、Java 反射 引言要解决这个...

    EasonTyler 评论0 收藏0
  • android经典源码,很不错的开源框架

    摘要:地址项目介绍框架一个非常方便的页面框架,传递数据,跳转动画功能支持之间和之间的数据交互。项目介绍功能实现录音功能,提供暂停继续切换,并且监听音量大小以波浪线呈现出现。 高仿最美应用项目源码 项目介绍 这是仿最美应用开发的基于mvp+rxjava+retrofit的项目,很值得学 showImg(https://segmentfault.com/img/remote/1460000016...

    Gu_Yan 评论0 收藏0
  • Android特效 - 收藏集 - 掘金

    摘要:关于最友好的文章背压掘金前言背压可能是所有想要深入运用的朋友必须理解的一个概念。一概述这两天时间动手撸了个视图扩散切换效果的控制器,兼容至,更方便我们在视图切自定义控件之像一样使用添加和掘金添加和,实现像和一样的和和方法。 Android仿探探堆叠滑动控件(支持方向控制,内嵌入RecyclerView) - Android - 掘金堆叠滑动控件,类似于社交软件探探的效果,并增加以下扩展...

    KoreyLee 评论0 收藏0
  • 知识点掌握- 收藏集 - 掘金

    摘要:弹性拉伸,支持等大多数掘金文艺气质的竖排文本控件来啦掘金是一个竖排列的文本控件。的简书地址为复习之旅子线程更新掘金版本后耗时的操作比如请求网络,下载文件等不能在主线程执行,而且子线程也不能直接更新界面。 弹性拉伸 View,支持 RecyclerView, ListView, GridView, ScrollView 等大多数 view - Android - 掘金Elasticity...

    hosition 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<