5、在android9.0系统上使用了修改应用图标功能后,在最近任务栏里面不显示我们的app。关于这个问题在最后的开发规则里面也会给出解决方案。
多入口配置
多入口配置,字面意思就是应用程序的多个入口配置,在AndroidManifest.xml中有一个叫activity-alias的标签,这个标签从字面上看就能理解是activity别名的意思,这里我给出一个示例作下相应的说明。
activity-alias例子说明:
<activity-alias
android:name=“NewActivity1” // 注册这个组件的名字,不需要生成文件
android:enabled=“false” // 是否显示这个启动项
android:label=“Alias1” // 名称,也就是对应这个启动项显示在桌面上的app名称
android:icon=“@mipmap/ic_launcher_round” //图标,也就是对应这个启动项显示在桌面上的app图标
android:targetActivity=“.MainActivity” //对应的原来的Activity组件,这里路径要跟注册的Activity对应。
// LAUNCHER 启动入口
显示多个启动入口
然后这里我先做一个多个启动入口全部显示的app示例,这里需要写的代码都在清单文件中,代码如下:
<?xml version="1.0" encoding="utf-8"?>
运行后的效果如下:
可以看到桌面上显示了三个图标,进入的都是MainActivity这个页面,图标我用的自动生成的,就懒的去找图标了,效果上能看出来就行。
当然了,实际项目中我们只会显示一个图标,这里我们只需要把"别名1"和"别名2"的android:enabled="true"改为"false"就行了,这样就只显示一个图标了,就不放效果图了。
代码控制切换不同的应用图标显示
马上春节了,我们产品说到哪个时间点我们的应用图标就要换成春节用的图标了,当然,前面说了这些图标要先在应用写好,不是通过服务器动态拿的,而是应用内已经写好的。那这个时候我们就需要通过代码进行应用图标的动态切换了,这里我给出Demo里面布局如图:
这里三个按钮点击后切换到相应的应用图标和名称,"原ACTIVITY"代表只显示MainActivity这个原来的启动入口,"ALIAS_1"代表别名1,以此类推。
这三个按钮点击对应的代码如下:
/**
- 设置Activity为启动入口
- @param view
*/
public void setActivity(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_DISABLED, PackageManager
.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
“.MainActivity”), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager
.DONT_KILL_APP);
}
/**
- 设置别名1为启动入口
- @param view
/
public void setAlias1(View view) {
PackageManager packageManager = getPackageManager();
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
“.NewActivity1”), PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
“.NewActivity2”), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager
.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
“.MainActivity”), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager
.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 }
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语
- 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
- 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
- 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
- OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。
[外链图片转存中…(img-047L9oMh-1711781647304)]
[外链图片转存中…(img-dZ3JFm93-1711781647305)]