如何在Android桌面上隐藏应用程序图标?

3

我定义了一个应用程序,仅从我的其他应用程序中使用。因此,我希望隐藏此应用程序的图标,以便用户无法在手机桌面上看到它(或者您如何称呼列出所有应用程序的东西?)。我的清单文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="xyz.games.pacman.controller"
      android:versionCode="1"
      android:versionName="1.0">

      <uses-permission android:name="android.permission.BLUETOOTH"/>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".PacmanGame"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="pacman.intent.action.Launch" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

         <receiver android:name="xyz.games.pacman.network.MessageListener">
         <intent-filter>
            <action android:name="xyz.games.pacman.controller.BROADCAST" />
            </intent-filter>
         </receiver>

    </application>
    <uses-sdk android:minSdkVersion="7" />
</manifest> 

我已经阅读了这个问题:

如何在Android模拟器中隐藏应用程序图标?

但如果我只是删除这一行

<category android:name="android.intent.category.DEFAULT" />

在我的清单文件中,活动根本没有起作用(在调用活动中出现ActivityNotFoundException异常)。
有什么提示可以解决这个问题吗?我已经尝试过android.intent.category.EMBEDDED,但这也不起作用。
在互联网上,我找到了CommonsWare的答案http://osdir.com/ml/Android-Developers/2010-06/msg03617.html,可以使用PackageManager来完成。不幸的是,它没有详细说明如何实现,我在浏览PackageManager API时也找不到解决方案。
4个回答

1
尝试移除 intent-filter,直接使用启动器启动第二个活动:
Intent second = new Intent(context, xyz.games.pacman.controller.PacmanGame.class);
startActivity(second);

1
你需要创建一个自定义的意图过滤器,然后创建一个使用该过滤器的意图。
例如,在我的Funky Expenses应用程序中,外部应用程序可以添加交易。这是通过Funky Expenses的清单包含以下内容实现的:
    <activity android:name="com.funkyandroid.banking.android.ExternalEntryActivity">
        <intent-filter>
            <action android:name="com.funkyandroid.action.NEW_TRANSACTION" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

然后外部应用程序可以通过以下方式访问我的活动;

Intent launchIntent = new Intent();
launchIntent.setAction("com.funkyandroid.action.NEW_TRANSACTION");
... code to set parameters to be passed to activity ...
startActivity(launchIntent);

特别注意setAction调用,以设置正确的意图。


抱歉,但您是否已经阅读了我的问题?我可以启动活动,但我想隐藏第二个活动的图标。 - RoflcoptrException
他的代码完全做到了这一点。另一个选择是完全删除过滤器,直接通过包名和类名启动它。 - alexanderblom
Sebi;我的代码是其他人的完整示例。我已经包含了筛选器和启动活动的代码。这来自一个工作中的应用程序,其中活动的图标没有显示,并且执行了您要求的操作。 - Al Sutton
我做了完全相同的事情,我有两个图标。但是这些图标来自第一个活动。 - RoflcoptrException

1
为什么要写一个实际的(可执行)第二个应用程序,只是存在于从另一个应用程序收到某些东西时执行某些操作?
我建议您将此“应用程序”实现为服务(远程或本地)。该服务将在后台运行,并为您执行操作,不需要在屏幕上显示任何图标...
如果必要,您可以将此服务实施为远程服务,这意味着它在完全不同的进程中运行。而且:您实际上可以通过广播意图进行通信,就像您现在所做的那样,因此无需更改您的第一个应用程序...

这是不可能的。这是一个完整的游戏,只能从我们的P2P网络启动。也许在服务或其他地方做到这一点是可能的,但现在为时已晚。我只想隐藏它。 - RoflcoptrException

0

您必须删除整个 <intent-filter>,而不仅仅是 <category>


这个也不行。我得到了一个ActivityNotFoundException,因为第一个活动不能再启动第二个活动了。 - RoflcoptrException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接