Android动态修改应用图标和名称,android音频面试

.DONT_KILL_APP);
}
/**

  • 设置别名2为启动入口
  • @param view
    */
    public void setAlias2(View view) {
    PackageManager packageManager = getPackageManager();
    packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
    “.NewActivity1”), PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
    PackageManager.DONT_KILL_APP);
    packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
    “.NewActivity2”), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager
    .DONT_KILL_APP);
    packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
    “.MainActivity”), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager
    .DONT_KILL_APP);
    }

!!!这里要注意一个点,就是ComponentName里面的路径一定要写全了,如果在报错日志看到类似找不到这个路径的日志的话,那十有八九就是这个问题了。

切换的代码其实很少,大家看了基本上也都明白了,这里就不做过多解释了。这里我基于隐藏所以别名的情况下,也就是只显示原来的一个APP图标的情况,点一下"ALIAS_1"这个按钮,也就是将图标切换到"别名1",最终效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到只显示这一个入口了,但是如果大家在点了"ALIAS_1"之后,马上就返回到主页看盯着这个app的图标,我们会发现在它在大概10s内是没有变化的,在大概10s后才更新成我们切换的那个图标,还有,在它没更新成功的时候如果我们点这个原来的图标,一般会吐司一条“未安装”之类的信息(华为是未安装),这里我的小米是点了没有反应,要等大概10s秒后更新成功了才能点这个图标进入应用。所以,通过代码我们"已经做到了"图标的切换,但是!!!

那是不是这样就完了呢??显然不是的,问题还挺多的,我一一道来。

不知道大家在点了切换的按钮后有没有一直停在app里面,没有的话我们尝试点完后在app里面不要回到桌面,如果停在app里面的话,我们会在大概10s,也就是更新成功的时候,应用就会发生闪退了,也就是坑4这个问题。这个问题我做了很多测试,总结了一下原因和规避的方法,原因是我们在代码里面设置了我们原来的真实的那个MainActiviy的enable为false,代码如下:

packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
“.MainActivity”), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager
.DONT_KILL_APP);

只要代码设置了真实的那个Activity的enable为false,也就是代码对应的PackageManager.COMPONENT_ENABLED_STATE_DISABLED,那就会导致我们的应用闪退,那是不是我们不设置这个就好了呢?那我们不设置这个的话怎么隐藏真实的MainActivity的图标呢?这个解决方法后面我会提出来。

但是,你以为只有这个问题吗?其实还有坑,只是这个坑不容易发现,这个时候我们回到我们当前的情况,也就是当前我们已经切换到"别名1"了,桌面上也只有这个图标了,我们也能点击这个图标正常使用我们的应用,这些都没有问题,我们以为都是正常的了。但是,这个时候,如果我们通过adb,使用Android Studio运行项目的时候,会提示launch app失败,失败的信息如下:

01/10 16:48:54: Launching app
$ adb shell am start -n “com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity” -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Error while executing: am start -n “com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity” -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.wepon.switchicondemo/.MainActivity }
Error type 3
Error: Activity class {com.wepon.switchicondemo/com.wepon.switchicondemo.MainActivity} does not exist.

Error while Launching activity

同样导致的问题还有一个,就是我们代码动态切换了app图标之后,应用升级,也就是更新应用的时候,会导致安装失败,或者是安装完成后出现多个图标甚至是没有图标出现在桌面上了!!这些问题是要遇到运行,或者升级包的时候才会发现的,但是那时候发现就晚了,所以这是一个比较大的坑,这里对应的坑就是我在前面提到的坑2这个点。

这里还有一种情况也会导致坑2的发生,例如,我们Demo现在是一个MainActivity和两个别名,如果我们在下一个版本把这两个别名删除了,或者删除了我们当前安装包正在显示的别名,那么安装的新版本可能就不会有应用图标显示了,那就会导致我们应用安装成功了,但是却没有入口!

类似的问题还有一些,主要都是在应用升级后发生,而且不管是导致安装失败、安装后没有图标或者安装后产生多个图标,这些现象都是非常严重的,但是这些问题我们都是可以避免的,这里我总结了一些规则,按这些规则进行操作的话是不会产生以上这些问题的,当然,如果还有其他问题的话欢迎交流,因为我们的app也在做这个功能。

动态修改图标的开发规则,防坑专用

1、Activity的android:enabled属性,一定不要在代码里面去设置enabled这个值,否则会在切换图标的过程导致应用闪退,目前测试了小米、华为和官方模拟器都有在这个问题。

2、清单文件中设置Activity的android:enabled="false”,这个在之后的版本就固定这个值,如果设置为true了,则有可能在应用升级后出现多个图标;

3、然后为我们的应用设置一个默认的Activity-alias用来显示图标(也是唯一一个显示的,一般我们也只需要显示一个图标),也是用来代替第一点设置Activity的android:enabled="false”可能导致的桌面上没有应用图标的问题;

4、Activity-alias的android:enabled="true"的默认显示的项尽可能不要中途进行变动,如果确实需要使用新的默认值,则使用代码进行动态变换;

5、Activity-alias的android:enabled="true"的不要设置为多个,否则会出现多个图标,如果试图通过代码进行隐藏其中的一个或者几个,可能会出现图标消失的情况,这个第2点已经有提过了;

6、后面新的版本如果要加新的Activity-alias,那么都要设置android:enabled=“false”,这个清单文件中的值要设置成false,然后再通过代码动态变换;

7、后面新的版本的Activity-alias必须包含上一个版本的所有Activity-alias,主要是防止覆盖安装后应用图标消失的情况;

update:2019年1月14日下午5:09 新发现需要注意的问题--------------

8、设置enabled为false的Activity无法在代码中通过显式intent打开,会报错。例如:我在应用里面推送服务推送了一条指定打开页面SplashActivity的通知消息,而这个SplashActivity刚好设置了enabled为false的话,是打不开的,会有错误日志如下,其它同理(所以在项目里我将启动入口的Activity单独写出来了,除了作为启动入口用,就没有别的地方再用到这个Activity了。):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

update:2019年2月25日 新发现需要注意的问题--------------

9、这个问题是关于一开始说的第5个点,在9.0系统的最近任务栏不不显示我们的应用了,如果遇到这个问题,可以尝试设置一个闪屏activity,启动模式设置为SingleInstance,通过这个设置的闪屏activity来启动我们的应用就可以了。或者设置我们的主页activity为SingleInstance启动模式也是可以的,关键是看大家的项目需求,设置不一样从后台回到应用显示的页面也就不一样。这里的关键就是我们设置了enabled为false的activity要和其他的activity不在一个activity栈里面就行了(我暂时没明白这块的原理,也是猜想加代码实践后解决的)。

以上就是我在做这个功能的过程中总结出来的规则,目前没有发现在其它的问题,有别的问题的朋友欢迎留言讨论,还有,按照这些规则做的话,覆盖安装后的应用图标也会是你上一次通过代码动态修改成功的图标,因为手机的Launcher会有记录,也就是我们通过代码会修改这个在Launcher中的记录。

对了,我们在清单文件中配置的Activity和Activity-alias的icon和label信息在新的版本中都是可以换的,这些跟代码无关了,也就是跟我们平常换下app图标名称是一样的操作,希望大家不要误解了这里 -_-!!!。

最后

最后,可能有的同学会想,我现在的应用入口就是默认的一个Activity,默认的enable也是true,也没有配置任何的Activity-alias,而我在上面说的规则中都是建议清单文件中的Activity的android:enabled="false”,那有人可能就会想我的新版本设置成false会不会导致我的图标入口不见了呢?那么我告诉你,如果按照我上面说的规则对你的新版本(可以动态切换图标的版本)进行设置的话,是不会有以上情况产生的,这里我给一个针对这种情况进行升级的版本的清单文件的示例:

<?xml version="1.0" encoding="utf-8"?>













简单示例Demo

这里放一个简单的示例demo仅供参考
github.com/ywp0919/Swi…

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
给文章留个小赞,就可以免费领取啦~

戳我领取:3000页Android开发者架构师核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-ii30d6Yu-1710509065588)]

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

[外链图片转存中…(img-lDbw5avG-1710509065588)]

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值