Android 10如何隐藏应用图标

隐藏应用图标这个功能应该用的很少!毕竟用到这个功能的应用可想而之(手动滑稽)

隐藏图标的实现方式我想在网上查到很多了有在AndroidManifest实现的也用通过如下代码实现的

  /**
     * 启动组件
     * @param componentName 组件名
     */
    private void enableComponent(ComponentName componentName) {
        //此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性
        PackageManager mPackageManager=getPackageManager();
        mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    }

    /**
     * 禁用组件
     * @param componentName 组件名
     */
    private void disableComponent(ComponentName componentName) {
        PackageManager mPackageManager=getPackageManager();
        mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }

但是这些实现方式在Android 10系统上面好像不是那么有用!

为什么android10系统隐藏图标无效

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

看到这里是不是明白了为什么Android 10无法隐藏图标了,但是产品经理不听这些!就是要实现这个功能!那到底这个功能怎么适配Android 10呢!干货来了

利用activity-alias 这个是做啥的这里就不叙述了!实现的原理也很简单!就是针对Android 10系统给应用生成两个应用图标!主应用图标和副应用图标!副应用图标默认为透明图标,并且默认不显示!在调用隐藏图标的时候隐藏主应用图标,显示副图标!因为副图标是透明的所以在桌面是看不到的!(虽然看不到 但是还是实际存在的)
上代码

  <activity android:name=".MainActivity"
            android:launchMode="singleInstance"
            >
            <intent-filter>

                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Acitivity1"
            android:excludeFromRecents="true"
            android:exported="false"
            android:finishOnTaskLaunch="false"
            android:launchMode="singleInstance"
            android:theme="@style/KeepLiveTheme"/>


        <activity-alias
            android:name=".MainAliasActivity"
            android:targetActivity=".Acitivity1"
            android:label=""
            android:icon="@drawable/icon"//这里用透明图标
            android:enabled="false">//这个要为false 不然默认会显示两个图标

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity-alias>

icon文件

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

    <solid android:color="#00000000"/>

</shape>

Activity1是一个透明并且只有1像素的activity

public class Acitivity1 extends AppCompatActivity {
    @Override
    protected 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();

    }
}

这样点击副图标也不会显示跳转到应用详细信息了 !直接给用户感觉无响应!
以上就是针对Android 10系统做的一个方案!有用的话可以看看 没用的话就当看个热闹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章