如果你的应用需要隐藏图标,那么这篇文章接下来的段落对你可能有所帮助。
在找到本文之前,你也许已经尝试过诸如以下的解决方案:
1,AndroidManifest.xml文件中在入口Activity的intent-filter里去掉<category Android:name=”android.intent.category.LAUNCHER” />,或者将LAUNCHER改为DEFAULT
2,在程序中加入下面的代码
显示图片:
隐藏图标:
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了。
参考文章:
http://developer.android.com/guide/topics/manifest/intent-filter-element.html
http://wikidroid.sinaapp.com/AndroidManifest.xml_data
1、开发一个名为OpenNoIconAPP.apk的主APP,里面就一个按钮用于点击后打开子APP,核心跳转代码如下:
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_open_app:
/*
* Intent intent = getPackageManager().getLaunchIntentForPackage(
* "com.example.noicontest"); if (intent != null) { //
* startActivity(intent); } else {
* Toast.makeText(getApplicationContext(), "没有该子APP,请下载安装",
* Toast.LENGTH_LONG).show(); }
*/
Intent intent = new Intent();
ComponentName cn = new ComponentName("com.example.noiconapp","com.example.noiconapp.MainActivity");
intent.setComponent(cn);
intent.setAction("android.intent.action.MAIN");
try {
startActivityForResult(intent, RESULT_OK);
} catch (Exception e) {
Toast.makeText(this, "没有该子APP,请下载安装",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
2、开发名为NoIconAPP.apk的子APP(用于主APP去打开),该APP主要实现在桌面不显示图标。其中要想不显示桌面图标只需修改AndroidManifest.xml文件即可。具体如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.noiconapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.noiconapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- 要想在桌面不显示图标,只需注释掉APP入口Activity中的下面这句即可,或者把下面的LAUNCHER改成DEFAULT也行 -->
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
</intent-filter>
</activity>
</application>
</manifest>
3、上面的设置可以让桌面图标不显示的原因:
一般情况下,当我们的APK在被安装后,系统会自动创建我们的APK程序,系统Launcher(系统桌面应用程序)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序在运行后只会显示在“正在运行”的程序列表中,而不会在桌面上显示图标和名字。如果只是设置APP图标不可见而使用第一种方式(我注释的代码)打开APP是不会成功的,因为这样设置后,包名根本就没有加载到Launcher,所以通过 getPackageManager().getLaunchIntentForPackage()方法得到的Intent为null。
4、其它举例:
前几天更新了联通“手机应用厅”的最新版Android APP,发现新增加的“网络测速”功能其实是一个子APP,使用的正是这种方式。