Androidライブラリプロジェクトに取り組んでいます。デフォルトのsrc/main/AndroidManifest.xmlでは、MainActivityはランチャーアクティビティです。
何かのために、プロダクトフレーバーを作成しました。はい、さまざまな製品のフレーバー内でさまざまな活動を引き起こしたり、表示したりする場合に最適です。ただし、別のフレーバーアクティビティを新しいランチャーアクティビティとして登録しながら、デフォルトランチャーアクティビティをsrc/main /フォルダーから保持したいと思います。そのため、さまざまな製品フレーバーについて、さまざまなランチャーアクティビティを設定でき、それらから、src/main /でオリジナルの「ランチャー」アクティビティを開始できます。
誰かが私にそれを達成する方法を親切に教えてもらえますか?どうもありがとう。
ノート:
if (BuildConfig.FLAVOR.equals("flavorName"))
コードを元のランチャーアクティビティに追加することはお勧めしません。他の人からのプロダクションコードを変更したくないので(これはライブラリプロジェクトです)。
私はmanifestmerger
とtools:replace
を試しましたが、intent-filter
では機能しないようです(インテントフィルターの要素マージポリシーは常にあることに気付きました)。
<action Android:name="Android.intent.action.MAIN" /> <category Android:name="Android.intent.category.LAUNCHER" />
これがうまくいくかもしれない場合、それをうまく動かす方法を教えていただけませんか?ありがとう。
私が試したこと:
最後に、1行追加するだけで問題を解決できることがわかりました。
<category Android:name="Android.intent.category.DEFAULT" />
==================================================
明確にするために、もう一度問題と解決策を検討します。
src/main/Java
の下にはMainActivity
があり、対応するsrc/main/AndroidManifest.xml
にはランチャーアクティビティとしてMainActivityが指定されています。
<activity Android:name=".MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
それは非常に簡単な部分です。次に、製品のフレーバー部分から始めます。
なんらかの理由で、プロダクトフレーバーでは、MainActivityを上書きしたくありません。代わりに、YetAnotherMainActivity
を使用しています。目標はYetAnotherMainActivity
を製品フレーバーの新しいランチャーアクティビティとして設定し、MainActivity
を呼び出すことができるはずです。
そして、ここでは、新しいフレーバーの新しいアクティビティを新しいランチャーアクティビティとして設定する方法を示します。
flavorX/AndroidManifest.xml
:
<activity Android:name="com.example.YetAnotherMainActivity"
Android:label="@string/title_yet_another_main_activity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
ええ、それは非常に簡単です。 Android.intent.category.DEFAULT
を追加するだけです。
私は<activity-alias>
が他のどのソリューションよりも適していると思います(@JingLiが機能しなかった理由がわかりません。おそらく1年前に問題があったかもしれませんが、今のところ問題はありません)。
たとえば、main
には次のマニフェストがあります。
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.application">
<application>
<activity Android:name=".InfoActivity"/>
<activity-alias
Android:name="com.example.application.Launcher"
Android:targetActivity=".InfoActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN"/>
<category Android:name="Android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
</application>
</manifest>
そして、ランチャーアクティビティをDebugInfoActivity
フレーバーのdebug
に置き換えます。したがって、指定した<activity-alias>
タグのtargetActivity
属性を置き換えるだけです。
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<application>
<activity Android:name=".DebugInfoActivity"/>
<!-- to not litter the manifest -->
<activity
Android:name="com.example.application.InfoActivity"
tools:node="remove"/>
<activity-alias
Android:name="com.example.application.Launcher"
Android:targetActivity=".DebugInfoActivity"
tools:replace="Android:targetActivity"/>
</application>
</manifest>
ノート:
main
とdebug
に同じパッケージ名を使用しています。このソリューションでは、main
アクティビティエイリアスからすべての属性と子を継承して、debug
の属性と子を複製しないようにすることもできます。
私は遅れていないと思います:)それで今日、私は同じ問題を抱えました。 @seropersonソリューションは正しかったが、デフォルトのランチャーアクティビティがまったく必要ない場合は、フレーバーのマニフェストで以下のコードを使用してください。
<activity
Android:name=".DefaultLauncherActivity"
tools:node="remove"
>