Android清单合并:删除LAUNCHER意图过滤器无效。

10

在我的Android应用程序中,我使用了一个库项目并使用其中的一个活动。然而,在库项目中,该活动具有MAIN操作和LAUNCHER类别的intent-filter。因此,我将该活动添加到了我的清单文件中,并删除了intent-filter。清单似乎已正确合并到build/intermediates/manifests/full/debug/AndroidManifest.xml中,活动看起来符合预期(没有intent-filter):

    <activity
        android:name="com.michaelrnovak.util.logger.Logger"
        android:configChanges="orientation"
        android:label="@string/show_log" >
    </activity>

然而,当我在模拟器中从AndroidStudio启动应用程序时,库的Logger活动代替我的AlertsActivity被启动了。我做错了什么?

这是该库的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.michaelrnovak.util.logger"
      android:versionCode="8"
      android:versionName="1.5">
    <uses-permission android:name="android.permission.READ_LOGS" />
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity android:name=".Logger"
                  android:label="@string/app_name"
                  android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

我的应用程序清单包含以下相关活动定义:

    <activity
        android:name=".AlertsActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />          </intent-filter>
    </activity>
    <activity android:name="com.michaelrnovak.util.logger.Logger"
        android:label="@string/show_log"
        android:configChanges="orientation"
        tools:replace="android:label"
        >
        <intent-filter tools:node="removeAll" />
    </activity>

@Gavriel,请检查我的答案。它可能解决你的问题。 - Wooseong Kim
2个回答

18

你尝试过仅在类别节点上使用tools:node="remove"吗? 根据我的经验,它似乎有效。

像这样:


像这样:

<activity android:name="com.michaelrnovak.util.logger.Logger"
        android:label="@string/show_log"
        android:configChanges="orientation"
        tools:replace="android:label"
        >
        <intent-filter>
            <category   tools:node="remove" android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

9
仅删除 <category> 对我没有用,但同时删除 <category><action> 则有效。 <activity android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" tools:node="remove" /> <category android:name="android.intent.category.LAUNCHER" tools:node="remove" /> </intent-filter> </activity> 这比我以前的更好了。非常感谢! - CommonsWare
@CommonsWare,你最好发布一个答案,这样其他人就更容易看到这个解决方案了。 - Daniel

0

我在类似的情况下尝试了很多方法。我发现我必须在Activity节点中添加tools:node="replace"来删除intent-filter的特定actioncategory。试试这个方法吧 :)

<activity 
    android:name="com.michaelrnovak.util.logger.Logger"
    android:label="@string/show_log"
    android:configChanges="orientation"
    tools:replace="android:label"
    tools:node="replace">

    <!-- Rewrite the intent-filter you want -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

嘿,我有一个疑问。你刚刚使用了节点“replace”,但是没有添加“remove”节点就加入了intent-filter。那么,它对你来说是如何工作的呢? - Tushar Gogna

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