1、實驗環境
aosp 版本 10.0 系統
aosp 版本 13.0 系統
2、驗證結果
2.1 方式一
APP AndroidManifest.xml 中通過 activity-alias 配置帶 LAUNCHER 屬性 category,并且 android:enabled=“true”
10.0 系統中可安裝后正常顯示 icon,通過 setComponentEnabledSetting 隱藏 icon 成功,桌面上不留下 app 相關任何圖標
13.0 系統中可安裝后正常顯示 icon,通過 setComponentEnabledSetting 隱藏 icon 不成功,桌面上會留下透明占位 alias 圖標
2.2 方式二
APP AndroidManifest.xml 中通過 activity-alias 配置帶 LAUNCHER 屬性 category,并且 android:enabled=“false”
10.0 系統中首次安裝后直接不顯示 icon,但通過 setComponentEnabledSetting 可控制隱藏 icon 成功,桌面上不留下 app 相關任何圖標
13.0 系統中首次安裝后直接不顯示 icon,但通過 setComponentEnabledSetting 可控制隱藏 icon 成功,桌面上不留下 app 相關任何圖標
3、展開講講
目前隱藏圖標的思路幾乎都是這樣的,在 AndroidManifest.xml 中配置一些 activity-alias,然后通過
getPackageManager().setComponentEnabledSetting(new ComponentName(con,activityAliasName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
禁用(隱藏) activity-alias 組件
啟用(顯示) activity-alias 組件
在 10.0 以上高版本,谷歌加了補丁更新,導致此種方式不再適用。由這個值 show_hidden_icon_apps_enabled 控制
Settings.Global.putInt(getContentResolver(), “show_hidden_icon_apps_enabled”, 0);
經過驗證,將 show_hidden_icon_apps_enabled 改為 0,高版本上即可延用之前方式隱藏圖標。
但普通app是肯定改不了這個值的,沒有權限 Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
更多解釋可查看
那些年的Android開發經驗記錄
Android應用之隱藏桌面圖標的一種方法
android 動態修改dimens android動態修改圖標和名稱
4、測試代碼
<?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="cn.test.hideicon"><permission android:name="android.permission.WRITE_SECURE_SETTINGS"/><applicationandroid:allowBackup="true"android:icon="@drawable/icon_transparent"android:label="@string/app_name"android:roundIcon="@drawable/ic_cloud"android:supportsRtl="true"android:theme="@style/AppTheme"><!--<activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>--><activityandroid:name="cn.test.hideicon.AliasMainActivity"android:exported="true"android:theme="@style/KeepLiveTheme"><!-- <intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><dataandroid:host="MainActivity"android:scheme="com.learn.alias.target"tools:ignore="AppLinkUrlError" /></intent-filter>--><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.TEST" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="com.ksgzlf.djbwrpgk" /><data android:host="goapp.fromchrome" android:scheme="tgsoft" /></intent-filter></activity><!-- 外部要啟動的Activity --><activityandroid:name="cn.test.hideicon.MainActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance" /><activityandroid:name="cn.test.hideicon.AliasActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"android:theme="@style/TransparentStyle"><intent-filter><action android:name="android.intent.action.VIEW" /></intent-filter><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.TEST" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="com.ksgzlf.djbwrpgk" /><data android:host="goapp.fromchrome" android:scheme="tgsoft" /></intent-filter></activity><activity-aliasandroid:name="cn.test.hideicon.Alias1Activity"android:enabled="true"android:exported="true"android:icon="@drawable/ic_launcher_background"android:label="aaaa"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" />
<!-- <category android:name="android.intent.category.BROWSABLE" />-->
<!-- <category android:name="android.intent.category.TEST" />--><category android:name="android.intent.category.LAUNCHER" />
<!-- <category android:name="com.ksgzlf.djbwrpgk" />-->
<!-- <data android:host="goapp.fromchrome" android:scheme="tgsoft" />--></intent-filter></activity-alias><activity-aliasandroid:name="com.android.ui.ActivityAliasN"android:configChanges="keyboard|orientation|screenSize"android:enabled="false"android:exported="true"android:icon="@drawable/ic_launcher_background"android:label="bbbb"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias><activity-aliasandroid:name="com.android.ui.ActivityAlias5"android:configChanges="keyboard|orientation|screenSize"android:enabled="true"android:exported="true"android:icon="@drawable/icon_transparent"android:label="maygroup55555"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.CHOOSER" /><action android:name="android.intent.action.MAIN" /><action android:name="android.intent.action.VIEW" /><action android:name="android.intent.action.SEND" /><action android:name="android.intent.action.SEND_MULTIPLE" /><category android:name="android.intent.category.INFO" /><category android:name="android.intent.category.DEFAULT" /><category android:name="com.android.internal.category.PLATLOGO" /><category android:name="android.intent.category.BROWSABLE" /><action android:name="android.intent.action.PACKAGE_REMOVED" /><action android:name="android.intent.action.PACKAGE_REPLACED" /><action android:name="android.intent.action.PACKAGE_ADDED" /><action android:name="android.intent.action.PACKAGE_CHANGED" /><action android:name="com.ui.OnAlarmReceiver.ACTION_WIDGET_RECEIVER" /><action android:name="com.android.vending.billing.InAppBillingService.COIN" /><action android:name="com.android.vending.billing.InAppBillingService.COIO" /><action android:name="com.android.vending.billing.InAppBillingService.LUCM" /><action android:name="com.android.vending.billing.InAppBillingService.PROX" /><action android:name="ir.cafebazaar.pardakht.InAppBillingService.BIND" /><action android:name="ru.aaaaaaax.installer" /><action android:name="com.nokia.payment.iapenabler.InAppBillingService.BIND" /><action android:name="com.android.vending.billing.InAppBillingService.INST" /><action android:name="com.App.Reborn" /></intent-filter></activity-alias></application>
</manifest>
MainActivity.java
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//adb shell settings get global show_hidden_icon_apps_enabledtry {int showHidden = Settings.Global.getInt(getContentResolver(),"show_hidden_icon_apps_enabled", 1);Log.d("MainActivity", "showHidden: " + showHidden);if (showHidden != 0) {Settings.Global.putInt(getContentResolver(), "show_hidden_icon_apps_enabled", 0);Log.i("MainActivity", "set showHidden: ");}} catch (Exception e) {e.printStackTrace();}}public void show(View view) {String clazzName = "com.android.ui.ActivityAliasN";enableComponent(this, clazzName);enableComponent(this, "cn.test.hideicon.Alias1Activity");finish();}public void hide(View view) {String clazzName = "com.android.ui.ActivityAliasN";disableComponent(this, clazzName);disableComponent(this, "cn.test.hideicon.Alias1Activity");finish();}/*** 啟動組件*/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);}}
AliasMainActivity.java
public class AliasMainActivity extends AppCompatActivity {private Button toActivity, hideActivity;@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();}}