Android Xposed模块隐藏桌面图标代码

295 阅读1分钟

假设启动 activity 名称为 com.xx.MainActivity , activity-alias 名称为 com.xx.MainActivityAlias

AndroidManifest.xml 配置

<manifest>
    <!-- 其他代码省略 -->
    <application>
        
        <activity
            android:name="com.xx.MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="de.robv.android.xposed.category.MODULE_SETTINGS" />
            </intent-filter>
        </activity>  
        
        <activity-alias
            android:name="com.xx.MainActivityAlias"
            android:exported="true"
            android:targetActivity="com.xx.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
        
    </application>
</manifest>

代码

private static final String ALIAS_ACTIVITY_NAME = "com.xx.MainActivityAlias";
​
/**
 * 判断有没有隐藏
 * @return
 */
boolean isLauncherIconVisible() {
    ComponentName component = new ComponentName(this, ALIAS_ACTIVITY_NAME);
​
    PackageManager manager = getPackageManager();
    Intent intent = new Intent().setComponent(component);
​
    List<ResolveInfo> list;
​
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        list = manager.queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY));
    } else {
        list = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    }
​
    return list != null && !list.isEmpty();
}
​
/**
 * 设置隐藏与显示
 * @param visible
 */
void setLauncherIconVisible(boolean visible) {
    if (isLauncherIconVisible() == visible) return;
​
    ComponentName component = new ComponentName(this, ALIAS_ACTIVITY_NAME);
    PackageManager manager = getPackageManager();
​
    int newState = visible? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : ackageManager.COMPONENT_ENABLED_STATE_DISABLED;
​
    manager.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP);
}

说明: 部分手机隐藏了仍然会在桌面展示,只是点击会跳转到设置中的应用详情页