方法:
修改: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中被定义如下:
- <application>
- <activity android:name="DefaultActivity"
- android:excludeFromRecents="true">
- <intent-filter android:priority="1">
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.HOME" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- lt;/application>
Activity DefaultActivity的category被定义成HOME,并且priority为1,是比系统Launcher启动还要早的程序。
Provision中DefaultActivity的实现如下:
- public class DefaultActivity extendsActivity {
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- // Add a persistent setting to allow other apps to know the device hasbeen provisioned.
- Settings.Secure.putInt(getContentResolver(),Settings.Secure.DEVICE_PROVISIONED, 1);
- // remove this activity from the package manager.
- PackageManager pm = getPackageManager();
- ComponentName name = new ComponentName(this, DefaultActivity.class);
- pm.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
- // terminate the activity.
- finish();
- }
- }
DefaultActivity的原生实现只做了两件事:
- 没有UI界面,只是设置Setting项里的Settings.Secure.DEVICE_PROVISIONED为1,指示其他Framework和其他程序,机器已经Provisioned。
- Line#10~#12之后,Launcher才会被启动,完成整个启动过程。
注意:还没有Provisioned的机器,有些功能的表现是不一样的。比如,如果还没有Provisioned,锁屏程序不会锁屏;对HOME key的处理也不同;电话也是打不进来的,etc。
通过Provision,可以定制:
- 加入一些初始设置项的设定,比如时区/时间初始设定,背景数据是否允许,是否允许安装非Android市场上的程序,等不需要用户干预就可以完成的设置。具体也可看SdkSetup中的DefaultActivity完成的设置,除了多了些设置项的设置,并没有太多区别。
- 加入UI设计,引导用户一步步完成需要用户参与选择或输入的设置过程,也就是Setup Wizard的工作。
Android 如何隐藏应用程序的图标
如果你的应用需要隐藏图标,那么这篇文章接下来的段落对你可能有所帮助。
在找到本文之前,你也许已经尝试过诸如以下的解决方案:
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了。