方法:
修改:packages\apps\Provision,在這里將vending應用停用
try{
pm.setApplicationEnabledSetting("com.android.vending",
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0);}catch(...){}
并在Provision應用的AndroidManifest.xml中增加權限
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
setApplicationEnabledSetting//設置應用的屬性,是否禁用
setComponentEnabledSetting//設置一個組件的屬性,是否禁用
Android中的Provision其實就是類似剛出廠時或者恢復出廠設置之后,一步一步引導用戶完成各種設置的Setup Wizard程序。
在Android的原生代碼中,Provision并沒有被編譯進系統,這可能是Provision不被人所知的原因。另外SdkSetup是一個實現相同功能的程序,從名字來看,SdkSetup是被用來在模擬環境中完成初始設置的程序。
Provision在其AndroidManifest.xml中被定義如下:
Activity DefaultActivity的category被定義成HOME,并且priority為1,是比系統Launcher啟動還要早的程序。
Provision中DefaultActivity的實現如下:
DefaultActivity的原生實現只做了兩件事:
注意:還沒有Provisioned的機器,有些功能的表現是不一樣的。比如,如果還沒有Provisioned,鎖屏程序不會鎖屏;對HOME key的處理也不同;電話也是打不進來的,etc。
通過Provision,可以定制:
在找到本文之前,你也許已經嘗試過諸如以下的解決方案:
1,AndroidManifest.xml文件中在入口Activity的intent-filter里去 掉<category android:name=”android.intent.category.LAUNCHER” />,或者將LAUNCHER改為DEFAULT
2,在程序中加入下面的代碼
顯示圖片:
- PackageManager p = getPackageManager();
- p.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
隱藏圖標:
- 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 //隱藏應用圖標
我用這倆個值來顯示和隱藏應用圖標有問題,隱藏以后就無法在顯示應用圖標了,在設置里的所有應用里也找不到了;
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT //顯示應用圖標
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER // 隱藏應用圖標
將參數值該成這兩個值就沒有問題了,建議使用這兩個值,
3,去掉android:icon=”@drawable/ic_launcher”中的資源啊,等等等等。。。
但是試過了每一種方法之后你都發現起到了作用但是卻產生了其他的問題
這里先一個一個的解釋下,
如果去掉<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中這樣設置了,那 么應用圖標不會顯示,應用也不會運行。
那么,這也是不可行的~~~
第三種就不說了,我覺得是狗急跳墻的做法。
———————————分割線—————————————
接下來我要說的這種方法可以隱藏圖標,同是也可以正常啟動運行。
在manifest的入口activity里面intent-filter中設置<data></data>元素。
比如:
<data android:host=”AuthActivity” android:scheme=”com.android.example” />
注意,android:scheme是大小寫敏感的,必須以小寫字母開頭
也就是這個MainActivity可以響應Uri為com.android.example://AuthActivity的特定 Intent
但是為什么加入這個之后app就不顯示圖標了呢?
因為我們把app的入口Activity申明為由接收隱士的Intent來啟動,這樣自然也就不會顯示圖標了。
好了,如果需要顯示圖標的話而且也必須響應上述Uri的話,那么我們可以在該Activity中再加入一個intent-filter標簽,將data元素移到新建的標簽中。這樣應用既可以顯示圖標又可以響應特定的Uri了。