【问题标题】:Android application is installing two launcher iconsAndroid 应用程序正在安装两个启动器图标
【发布时间】:2019-11-15 05:34:44
【问题描述】:

不是重复的 Android Application creating two launcher icons(我的清单中没有多个 LAUNCHER 定义),也不是 Android Application Creating Two Launcher Icons instead of One(重启设备不会删除第二个启动器图标)。

我的 android 应用程序正在创建两个启动器图标,但其中一个似乎来自应用程序本身,而不是任何活动。我已将AndroidManifest.xml 裁剪到最小(加上清理、重建和重新安装),但我仍然得到两个图标(在我的 HTC One M8 物理手机和我的 Nexus 5 模拟器上):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name=".SplashActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我的清单中没有任何东西

...我定义的应用程序本身是否会以某种方式创建图标?或者是否有其他方式让我得到多个启动器图标?

如果我将 android:labelandroid:icon 功能移动到 .SplashActivity 定义中,则创建的启动器图标之一将替换为默认的绿色小机器人图标。

【问题讨论】:

  • 感觉就像您正在从正在使用的某个库中获取活动。如果您使用的是 Android Studio 2.2 或更高版本,请打开清单并切换到底部的“Merged Manifest”子选项卡,看看那里是否显示了其他活动。
  • 我从来不知道这种观点!我确实在那里找到了另一个LAUNCHER 活动。谢谢@CommonsWare。 :)

标签: android android-manifest android-launcher


【解决方案1】:

活动和其他明显的好处来自多种来源:

  • main 源集中的清单
  • 任何构建类型或产品风味源集中的清单
  • 任何库模块或 AAR 中的清单
  • Gradle(例如,minSdkVersion

Android Studio 2.2 为我们提供了一个方便的工具来检查进入我们的 APK 的真实清单,这些清单是从所有这些来源合并而来的。如果您在 Android Studio 中打开清单,请单击“清单合并”子选项卡(朝向 IDE 底部)。这将显示合并清单中的内容以及谁应该为此负责它来自哪里。

如果您在清单中看到除了清单中的活动之外的其他活动,那就是您的启动器图标的来源。然后,您需要决定:

  • 这是您真正想要的活动吗?
  • 如果不是,那么该活动的来源是您真正想要的吗? (如果没有,核对它)
  • 如果您想要源而不是活动,您可以在清单中使用tools:replace 属性装配另一个活动元素,以覆盖库中的元素并抑制&lt;intent-filter&gt;

【讨论】:

  • 我为 2 个活动定义了动作“android.intent.action.MAIN”,但我只想显示其中一个。我可以使用 tools:replace 覆盖第一个活动的操作 Main(只读为来自 lib)
  • @TusharGogna:“我可以使用工具:替换来覆盖第一个活动的主要操作(只读为来自库)” - 是的。创建一个&lt;activity&gt; 元素,其android:name 与库中的活动匹配,然后您可以从那里控制该特定活动的清单条目。
  • 我尝试通过在活动标签中添加&lt;action android:name="android.intent.action.MAIN" tools:node="remove" /&gt; 来保持相同的名称,但它似乎不起作用。我对&lt;category android:name="android.intent.category.LAUNCHER" tools:node="remove" /&gt; 做了同样的事情!活动的名称相同:基本上是整个 path.ActivtyName。我还需要做其他事情吗?
  • @TusharGogna:我建议您提出一个单独的 Stack Overflow 问题,您可以在其中提供一个 minimal reproducible example 显示您的清单尝试,以及您试图抑制的活动的详细信息。跨度>
【解决方案2】:

我的问题是,我已将以下意图过滤器添加到多个活动中。为一个 Activity 配置它为我解决了这个问题。

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2023-03-31
    • 2018-04-09
    • 2013-07-15
    相关资源
    最近更新 更多