Android7.0 - 9.0应用图标隐藏

Android1.0到9.0隐藏应用图标的方法很简单,只需要AndroidManifest.xml文件中的MainActivity中添加代码:

 <data android:host="MainActivity" android:scheme="com.learn.alias.target"tools:ignore="AppLinkUrlError" />

示例如下:

<activityandroid:name="com.learn.alias.target.MainActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><data android:host="MainActivity" android:scheme="com.learn.alias.target"tools:ignore="AppLinkUrlError" /></intent-filter>
</activity>

即可完成对应用图标的隐藏。不过这里需要注意一下,
android:scheme是大小写敏感的,必须以小写字母开头。
scheme设置后表示这个MainActivity可以响应Uricom.learn.alias.target的特定Intent

另外为什么加入这个之后app就不显示图标了呢?
因为这里把app的入口Activity声明为由接收隐式的Intent来启动,也就不会显示图标了。

外部隐式启动方式:

String scheme = "com.learn.alias.target";
Intent intent = new Intent();
intent.setComponent(new ComponentName(pkgName, clsName));
// 这里传设置好的scheme值
intent.setData(Uri.parse(scheme));
startActivity(intent);

这种方式既能隐藏图标,又可以被外部应用隐式启动,在Android系统10.0以下,这个方式是可以用的。但是Android系统10.0却不能用,下面就来做一下Android10.0的图标隐藏方式。

Android10.0应用图标隐藏

问题:上面的方法在Android10.0上为什么失效?

Android 10 限制了应用隐藏其启动器图标的能力。如果某个应用没有已启用的启动器 Activity,则系统会在启动器中显示一个合成的 Activity;此合成的 Activity 代表该应用在系统设置中的详情页面。
除非满足以下任一条件,否则应用必须具有图标:

  • 它是系统应用,即使是更新后的应用。
  • 它是托管式配置文件管理应用(工作资料所有者)。
  • 它未请求任何权限。
  • 它不包含任何组件(例如,Activity、内容提供程序、广播接收器和服务)。
  • 具有图标且拥有已启用的可启动 Activity 的应用不受影响。除了上面列出的例外情况,所有应用均会显示一个图标。如果应用没有图标,则会显示默认的系统图标。点按没有可启动 Activity 的应用图标时会打开应用信息屏幕。

如需详细了解用于显示应用图标的逻辑,包括不显示哪些类型的应用的应用图标
Android官网说明:
https://source.android.google.cn/setup/start/android-10-release?hl=zh-cn
https://developer.android.google.cn/reference/kotlin/android/content/pm/LauncherApps?hl=zh-cn#getactivitylist

解决方法:利用activity-alias来实现
从文章
https://blog.csdn.net/qq_30710615/article/details/106298458

https://stackoverflow.com/questions/8398514/hide-application-icon
中可以得知利用activity-alias可以实现Android10.0上应用图标隐藏功能,但唯一有个缺陷就是会保留透明的占位alias的图标。
具体实现步骤如下:

实现步骤

1. 创建AliasActivity.java

AliasActivity是一个1像素的透明Activity。

public class AliasActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Window window = getWindow();// 设置窗口位置在左上角window.setGravity(Gravity.LEFT | Gravity.TOP);WindowManager.LayoutParams params = window.getAttributes();params.x = 0;params.y = 0;params.width = 1;params.height = 1;window.setAttributes(params);finish();}
}

2. 创建AliasMainActivity

AliasMainActivity中在10.0以下,要禁用Alias1Activity,这样就不会显示透明图标(部分机型可能有缺陷)。

public class AliasMainActivity extends AppCompatActivity {private Button toActivity, hideActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 先禁用AliasMainActivity组件,启用alias组件AppIconUtil.set(AliasMainActivity.this, "com.learn.alias.target.AliasMainActivity", "com.learn.alias.target.Alias1Activity");// 10.0以下禁用alias后,透明图标就不存在了,10.0的必须开启,不然会显示主应用图标,10.0会有一个透明的占位图if (Build.VERSION.SDK_INT < 29) {// 禁用Alias1ActivityAppIconUtil.disableComponent(this,"com.learn.alias.target.Alias1Activity");}Window window = getWindow();// 设置窗口位置在左上角window.setGravity(Gravity.LEFT | Gravity.TOP);WindowManager.LayoutParams params = window.getAttributes();params.x = 0;params.y = 0;params.width = 1;params.height = 1;window.setAttributes(params);finish();}
}

3. 创建AppIconUtil

AppIconUtil工具类,禁用或启用组件。

public class AppIconUtil {/**** @param context* @param main com.learn.alias.MainActivity* @param alias com.learn.alias.AliasActivity*/public static void set(Context context, String main, String alias) {disableComponent(context, main);enableComponent(context, alias);}/*** 启动组件*/public static void enableComponent(Context context, String clazzName) {ComponentName componentName =  new ComponentName(context, clazzName);PackageManager mPackageManager = context.getPackageManager();mPackageManager.setComponentEnabledSetting(componentName,                      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);}/*** 禁用组件*/public static void disableComponent(Context context, String clazzName) {ComponentName componentName =  new ComponentName(context, clazzName);PackageManager mPackageManager = context.getPackageManager();mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);}}

4. 新增透明图标

创建alias_icon.xml添加到drawable目录下,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#00000000"/>
</shape>

5. 新增透明主题

新增KeepLiveTheme主题到res\values下的style.xml文件中

<style name="KeepLiveTheme" parent="AppTheme"><item name="android:windowBackground">@null</item><item name="android:windowIsTranslucent">true</item>
</style>

6. 修改AndroidManifest.xml文件

  • AliasMainActivity
    启动Activity。
  • MainActivity
    外部要启动的Activity。
  • AliasActivity
    Alias图标启动的Activity。
  • Alias1Activity
    activity-alias配置。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.learn.alias"><applicationandroid:allowBackup="false"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><activityandroid:name="com.learn.alias.target.AliasMainActivity"android:theme="@style/KeepLiveTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><data android:host="MainActivity" android:scheme="com.learn.alias.target"tools:ignore="AppLinkUrlError" /></intent-filter></activity><!-- 外部要启动的Activity --><activityandroid:name="com.learn.alias.target.MainActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"></activity><!-- Alias图标启动的Activity --><activityandroid:name="com.learn.alias.target.AliasActivity"android:excludeFromRecents="true"android:exported="false"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"android:theme="@style/KeepLiveTheme" /><!-- activity-alias配置 --><activity-aliasandroid:name="com.learn.alias.target.Alias1Activity"android:enabled="true"android:icon="@drawable/alias_icon"android:label=""android:launchMode="singleTask"android:targetActivity="com.learn.alias.target.AliasActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias></application>
</manifest>

这种方式可以在7.0-10.0上隐藏图标,在10.0上会有透明图标占位,点击无反应。外部跳转的是MainActivity。
最后,demo源码地址:https://github.com/RenZhongrui/android-learn/tree/master/013-android-alias%20-hide

学习参考:
https://blog.csdn.net/lzfengluo/article/details/87812889
https://blog.csdn.net/qq_30710615/article/details/106298458
https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201288299092590368&fid=24

Android10.0应用图标隐藏方案(7.0-10.0)相关推荐

  1. 一加6点击五下出来Android10,一加6T现已推送Android 10.0公测版更新

    IT之家10月10日消息 据一加社区官方消息,一加6T Android 10.0公测版现已推送,详情如下. ▲图源IT之家网友投稿 [更新日志] 系统更新至Android 10版本 全新的UI设计,轻 ...

  2. android10 三星升级计划,国行三星手机Android 10.0升级计划表 Note10明年2月升级

    原标题:国行三星手机Android 10.0升级计划表 Note10明年2月升级 11月28日,三星公布了国行三星手机Android 10.0升级计划,Android 10.0将搭配三星自家的One ...

  3. 程序员快放弃 Android 9.0 吧,10.0 正在来的路上!

    本文经授权转自终端研发部(ID:codeGoogler) 目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 An ...

  4. 鸿蒙就是安卓10,紧跟鸿蒙,华为宣布基于安卓10.0全新系统:8月9日见

    原标题:紧跟鸿蒙,华为宣布基于安卓10.0全新系统:8月9日见 华为将会在开发者大会上展示自主系统鸿蒙,而目前他们正在调试当中,以此希望新的系统能够吸引开发者,并为它建立起来一个良性的生态系统环境. ...

  5. 华为新系统鸿蒙展示,紧跟鸿蒙,华为宣布基于安卓10.0全新系统:8月9日见

    华为将会在开发者大会上展示自主系统鸿蒙,而目前他们正在调试当中,以此希望新的系统能够吸引开发者,并为它建立起来一个良性的生态系统环境. 7月12日消息,对于外界关注的基于Android 10.0的EM ...

  6. libcudart.so.10.0: cannot open shared object file: No such file or directory

    tensorflow 2.0.0b1 cuda:10.1 报错,使用tf.test.is_gpu_available()测试时也是false,原来是这个版本只支持10.0,不支持10.1. 解决办法: ...

  7. 安装perl5.10.0

    目的:本人使用的Linux系统CentOS5.8中最新的perl版本是5.8.8.学习perl语言入门,一般情况下够用,但是在使用given-when这种结构的时候,就必须指定5.10版本(use 5 ...

  8. 华为系统10.0是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...

    原标题:暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角 华为鸿蒙系统由于顶着"自研"的光环,自曝光以来便受到科技圈的追捧,虽并未推出但已经有"众星捧月&qu ...

  9. 华为emui10.0系统是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...

    华为鸿蒙系统由于顶着"自研"的光环,自曝光以来便受到科技圈的追捧,虽并未推出但已经有"众星捧月"的迹象.媒体追逐鸿蒙系统自然是为了热度和流量,但对消费者来说过分 ...

  10. 鸿蒙调出安卓10彩蛋,暂时忘记鸿蒙!华为 EMUI 10.0 发布时间确认:这才是主角...

    华为鸿蒙系统由于顶着 " 自研 " 的光环,自曝光以来便受到科技圈的追捧,虽并未推出但已经有 " 众星捧月 " 的迹象.媒体追逐鸿蒙系统自然是为了热度和流量,但 ...

最新文章

  1. 微软旷视人脸识别100%失灵!北京十一学校校友新研究「隐身衣」,帮你保护照片隐私数据...
  2. 解决slf4j 冲突
  3. mysql5.7中root密码忘记后修改密码
  4. 使用代码创建SAP CRM服务请求文档的subject测试数据
  5. LeetCode 第 19 场双周赛(231 / 1120,前20.6%)
  6. mysql中设置字符_MySQL中设置默认字符集的方法
  7. SAP License:一个资深SAP顾问的2021年项目总结
  8. 【安装包】PhpStorm-2018.1
  9. 【手写数字识别】基于matlab GUI模板匹配手写数字识别【含Matlab源码 094期】
  10. Fiddler+Android7.0+python+requests获取app评论内容《完美解决了代理后打开app没有网络的问题!!!》JustTrustMe+VirtualXposed工具的使用
  11. 华南师范大学计算机学院2015级,2015年华南师范大学教育信息技术学院全日制硕士录取公示...
  12. kind安装k8s集群
  13. SAP 取标标准成本和实际成本
  14. 计算机知识竞赛赛制,知识竞赛活动规则
  15. quartus18.1和modelsim的下载安装
  16. 计算机网络概念基础——分组交换
  17. 反映个把月才退了个零头 ——消费者投诉旅游平台退款难
  18. 【阿朱标红】O2O五年三次创业的九大经验(天天用车CEO翟光龙)
  19. greendao 默认数据库db 生成路径,以及db文件导出
  20. 对#Hello,2015征文#+Android 热敏打印机打印二维码(图片)博客的尝试

热门文章

  1. 数理统计实(试)验—双因素方差分析(无交互作用)excel操作分析方差分析表怎么看?
  2. 基于python的简易安卓小外挂制作
  3. 毕业设计 : 中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类
  4. 关于职称评审的一些见解
  5. 源领域和目标领域过程相似性分析
  6. 如何应用计算机键盘截图,计算机屏幕截图的键盘快捷键是哪个键?在计算机上截图的方法...
  7. ffmpeg音频格式转换
  8. 三级指标 主成分分析_一文看懂主成分分析(PCA)
  9. 不同tric 改进的理由
  10. 计算机无法正常启动安全模式开启,Win7电脑开机无法正常启动只能进入安全模式怎么解决...