安卓应用安装后出现两个启动图标的问题

4

这不是Android应用程序创建两个启动器图标的重复问题(我的清单文件中没有多个LAUNCHER定义),也不是Android应用程序创建了两个启动器图标而不是一个(设备重新启动并不能删除第二个启动器图标)。

我的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定义中,则创建的一个启动器图标将被默认的小绿色机器人图标替换。


2
感觉你正在从所使用的某个库中调用一个活动。如果你使用的是Android Studio 2.2或更高版本,请打开清单文件并切换到底部的“合并清单”子选项卡,查看是否有其他活动显示在那里。 - CommonsWare
我从未知道那个视图!我确实在那里找到了另一个LAUNCHER活动。谢谢@CommonsWare。 :) - Valkyrie Savage
2个回答

7

活动和其他清单相关的好处来自各种来源:

  • 主要源集中的清单
  • 任何构建类型或产品风味源集中的清单
  • 任何图书馆模块或AAR中的清单
  • Gradle(e.g.,minSdkVersion)

Android Studio 2.2为我们提供了一种方便的工具,用于检查合并自所有这些来源的有效清单进入我们的APK。如果您在Android Studio中打开清单,则点击“Manifest Merger”子选项卡(位于IDE底部)。这将显示合并清单中的内容以及它来自哪里。

如果您在那里看到除您的manifest之外的其他活动,则这是您启动器图标的来源。然后,您需要决定:

  • 那个活动是否真的是你想要的?
  • 如果不是,那么该活动的来源是否真的是你想要的?(如果不是,请删掉)
  • 如果您想要源但不需要活动,则可以在您的清单中设置另一个活动元素,带有tools:replace属性,以覆盖库中的活动并禁止<intent-filter>

我为2个活动定义了“android.intent.action.MAIN”操作,但我只想显示其中一个。我可以使用tools:replace来覆盖第一个活动(只读作为来自库的内容)的主要操作吗? - Tushar Gogna
1
@TusharGogna: “我能使用tools:replace来覆盖第一个活动的Main操作吗(只读取自库)” - 是的。创建一个<activity>元素,其android:name与库中的活动名称匹配,然后您可以从那里控制特定活动的清单条目。 - CommonsWare
1
我尝试了在 activity 标签中添加 <action android:name="android.intent.action.MAIN" tools:node="remove" /> ,并保持相同的名称,但似乎没有起作用。我也使用 <category android:name="android.intent.category.LAUNCHER" tools:node="remove" /> 进行了相同操作!活动的名称是相同的:基本上是整个路径。ActivityName。我还需要做其他什么吗? - Tushar Gogna
@TusharGogna:我建议您提出一个单独的Stack Overflow问题,在那里您可以提供一个[mcve],展示您的清单尝试,以及您试图抑制的活动的详细信息。 - CommonsWare
是的,这里是问题链接:https://stackoverflow.com/questions/64066594/android-manifest-merger-warning-related-to-no-other-declaration-present - Tushar Gogna

5

我的问题是,我在多个Activity中添加了以下intent-filter。只为一个Activity配置它就为我解决了问题。

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

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