web-dev-qa-db-ja.com

製品フレーバーで別のランチャーアクティビティを使用するにはどうすればよいですか?

Androidライブラリプロジェクトに取り組んでいます。デフォルトのsrc/main/AndroidManifest.xmlでは、MainActivityはランチャーアクティビティです。

何かのために、プロダクトフレーバーを作成しました。はい、さまざまな製品のフレーバー内でさまざまな活動を引き起こしたり、表示したりする場合に最適です。ただし、別のフレーバーアクティビティを新しいランチャーアクティビティとして登録しながら、デフォルトランチャーアクティビティsrc/main /フォルダーから保持したいと思います。そのため、さまざまな製品フレーバーについて、さまざまなランチャーアクティビティを設定でき、それらから、src/main /でオリジナルの「ランチャー」アクティビティを開始できます。

誰かが私にそれを達成する方法を親切に教えてもらえますか?どうもありがとう。

ノート:

  1. if (BuildConfig.FLAVOR.equals("flavorName"))コードを元のランチャーアクティビティに追加することはお勧めしません。他の人からのプロダクションコードを変更したくないので(これはライブラリプロジェクトです)。

  2. 私はmanifestmergertools:replaceを試しましたが、intent-filterでは機能しないようです(インテントフィルターの要素マージポリシーは常にあることに気付きました)。

<action Android:name="Android.intent.action.MAIN" /> <category Android:name="Android.intent.category.LAUNCHER" />

これがうまくいくかもしれない場合、それをうまく動かす方法を教えていただけませんか?ありがとう。

23
Jing Li

私が試したこと:

  1. Manifest Mergerを有効にすると、機能しません。
  2. activity-aliasを使用することもできません。

最後に、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を追加するだけです。

33
Jing Li

私は<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>

ノート:

  • この例では、maindebugに同じパッケージ名を使用しています。
  • アクティビティーエイリアスの完全な名前を入力する必要があります。これにより、マージャーはそれらを正しくマージできます。

このソリューションでは、mainアクティビティエイリアスからすべての属性と子を継承して、debugの属性と子を複製しないようにすることもできます。

8
seroperson

私は遅れていないと思います:)それで今日、私は同じ問題を抱えました。 @seropersonソリューションは正しかったが、デフォルトのランチャーアクティビティがまったく必要ない場合は、フレーバーのマニフェストで以下のコードを使用してください。

<activity
        Android:name=".DefaultLauncherActivity"
        tools:node="remove"
        >
1
nitesh goel