我有
<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
虽然我正在使用Eclipse构建&amp;运行具有多个库项目的单个主项目,将只安装1个应用程序。
但是,如果我迁移到Android Studio来构建&amp;运行具有多个库项目的单个主项目,将安装多个应用程序,
取决于有多少项目(无论主要项目或图书馆项目)定义<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
我在想,是否有任何我在Android Studio中做错的配置,导致安装多个应用,当我构建&amp;运行项目?
目前,我唯一的解决方法是从所有图书馆项目中删除这些行(<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
)&#39; AndroidManifest.xml
。这是常见的吗?正确的方法,在Android Studio中导入项目库?与在Eclipse中一样,这些行不会在我的设备中安装额外的应用程序。
这就是我的项目结构的样子
如您所见,第一个文件夹图标看起来与其他文件夹图标不同。我想这表明,第一个文件夹图标是主项目,其他是图书馆项目。
如果只有一个主项目,为什么要安装多个应用程序?
答案 0 :(得分:7)
在Eclipse中,仅使用主应用程序项目中的AndroidManifest.xml
。在Android Studio(和Gradle构建系统)中,所有清单都合并在一起。
清单中<activity>
元素内的以下行表示该活动应显示在启动器菜单中。如果您不希望这样,请删除这些行。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
所有这些都是预期的行为。
答案 1 :(得分:4)
还有另一种骇人听闻的方式。
查看合并后的AndroidManifest.xml。它应该位于:
<your_project>/build/intermediates/manifests/full/<debugOrRelease>/AndroidManifest.xml
搜索LAUNCHER <activity>
标记。在您的情况下,您应该有超过1个LAUNCHER <activity>
标签。我的情况如下:
<activity
android:name="com.stockhut.SplashScreenActivity"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" >
</action>
<category android:name="android.intent.category.LAUNCHER" >
</category>
</intent-filter>
</activity>
...
<activity
android:name="com.todddavies.components.progressbar.main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
就我而言,com.todddavies.components.progressbar.main
是一个图书馆项目,其示例项目已被声明为LAUNCHER。正确的启动器应为com.stockhut.SplashScreenActivity
。
在主项目中打开AndroidManifest.xml,添加以下内容:
<activity
android:name="com.todddavies.components.progressbar.main"
android:label="@string/app_name" tools:node="remove" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
记下标记tools:node="remove"
。根据{{3}}:
标记是工具命名空间中的一个特殊属性,用于表达如何解决冲突的特定决策。
因此,带有标记<activity>
的{{1}}代码会告诉Gradle在发生冲突时自行删除。换句话说,我们在某种程度上强迫发生冲突&#34;。它有点神圣,但它确实有效。
您始终可以在上述路径中验证合并的AndroidManifest.xml。
答案 2 :(得分:1)
在Android工作室中,他们一次只能添加一个项目。 如果您有带项目的库,那么您必须在项目中添加整个代码或 您可以为库项目创建jar并将其添加到项目中。
Android Studio中还有另一种gradle选项。 如果我们想在项目中使用任何库,我们可以在&#34; build.gradle&#34;中添加它们的依赖项。项目文件。
我附上&#34; build.gradle&#34;文件请参考。
现在,就图书馆项目而言,(如果它没有为您的项目做出贡献)最佳方法是在Android清单中,您应该只将您定义的活动设置为启动器活动,因为在大多数情况下,库是AndroidManifest。 xml通常包含一些示例Activity(应该被删除),或者你需要子类化的Activity,库项目中应该有最少的定义的东西(可以忽略不计),你的Manifest中应该有大部分内容,包括所有权限。
它也是在android开发者网站上定义的
&#34;过滤器&#34; android.intent.action.MAIN&#34;和 &#34; android.intent.category.LAUNCHER&#34;设置将活动广告为 启动应用程序的应用程序 - 即应该是应用程序 显示在应用程序启动器中。图标和标签设置在 因此,过滤器是启动器中显示的过滤器。&#34;
您也可以参考链接... http://developer.android.com/guide/topics/manifest/manifest-intro.html