1. 程式人生 > >Android隱藏app桌面圖示

Android隱藏app桌面圖示

在啟動的activity的AndroidManifest註冊中,新增隱式啟動的data:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.tq.time">
<!--
  <data android:host="MainActivity" android:scheme="com.tq.time" />
  這條屬性可以讓啟動app入口Activity申明為由接收隱士的Intent來啟動,這樣自然也就不會顯示圖示了
-->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <data android:host="MainActivity" android:scheme="com.tq.time" />
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
這個是我當時寫的Demo,也是最終的處理方案,這樣把啟動activity的intent變為隱式的,桌面的圖示就會被隱藏,那麼就實現我希望實現的效果了。
下面是要說一下當時探索的時候遇到的問題。


刪除應用圖標的若干解決方案:

1、AndroidManifest.xml檔案中在入口Activity的intent-filter裡去掉
[html] view plain copy  print?
  1. <categoryandroid:name=”android.intent.category.LAUNCHER” />
或者將LAUNCHER改為DEFAULT

或者在在程式中加入下面的程式碼

      init();
//        PackageManager p = getPackageManager();
//        p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    }
PackageManager.COMPONENT_ENABLED_STATE_ENABLED //顯示應用圖示
PackageManager.COMPONENT_ENABLED_STATE_DISABLED //隱藏應用圖示

網上找到的部落格說這倆個值來顯示和隱藏應用圖示有問題,隱藏以後就無法在顯示應用圖示了,在設定裡的所有應用裡也找不到了;

但是實際除錯中,我根本無法安裝demo到手機上,可能是新的AS不允許這種操作吧!

但是會有如下幾個問題:
1、如果去掉<category android:name=”android.intent.category.LAUNCHER” />,就表示app沒有啟動入口了,
這樣子確實是解決了不顯示圖示的效果,但是那樣的話我們的應用也執行不了了,失敗的方案。
然後我看了android developer上的說明:
public static final int COMPONENT_ENABLED_STATE_DISABLED
Flag for setApplicationEnabledSetting(String, int, int) and setComponentEnabledSetting(ComponentName, int, int): This component or application has been explicitly disabled, regardless of what it has specified in its manifest.
意思是,即使你在manifest中聲明瞭這個component或application,當你設定為COMPONENT_ENABLED_STATE_DISABLED時,他們都是不可用的。也就是說,如果你在MainActivity中這樣設定了,那麼應用圖示不會顯示,應用也不會執行。

還有一種方案但是這個方案是不是在所有的android 手機都試用還有待確認,我是這麼操作的,在AS裡面修改程式碼包名路徑,在每個相關地方修改但是不要修改清單檔案裡的,這樣在MIUI系統裡系統清單還是修改之前的包名,但是實際包名已經是修改之後的了,也達到了沒有圖示的要求,但是會導致之後安裝什麼app都不現實圖示

最優的解決方案:

就是我開始用的那個方法!

接下來我要說的這種方法可以隱藏圖示,同是也可以正常啟動執行。
在manifest的入口activity裡面intent-filter中設定<data></data>元素。

比如:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <data android:host="MainActivity" android:scheme="com.tq.time" />
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

注意,android:scheme是大小寫敏感的,必須以小寫字母開頭
也就是這個MainActivity可以響應Uri為com.android.example://AuthActivity的特定 Intent

但是為什麼加入這個之後app就不顯示圖示了呢?

      因為我們把app的入口Activity申明為由接收隱士的Intent來啟動,這樣自然也就不會顯示圖示了。
如果需要顯示圖示的話而且也必須響應上述Uri的話,那麼我們可以在該Activity中再加入一個intent-filter標籤,將data元素移到新建的標籤中。

這樣應用既可以顯示圖示又可以響應特定的Uri了。