2017-03-02 5 views
0

私は現在、2つの異なる形式のコードベース、レガシー、およびアップデートされたバージョンのアプリケーションが必要です。私はこれにFlavorsを使用していますが、2つのアプリアイコンがインストールされている問題にぶち当たっています。その理由は、従来のコードベースと更新されたコードベースの両方に独自のmanifest.xmlがあり、マニフェストの内部には、メインの起動クラスとその相対的なアプリケーションアイコンを識別するための宣言があるからです。Flavorsと複数のマニフェストファイルを使用して複数のアプリアイコンがインストールされています

<!-- legacy code manifest --> 
    <activity 
     android:name="legacy.activity.RegistrationActivity" 
     android:configChanges="orientation|screenSize" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/CustomAppTheme" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <!-- updated code manifest --> 
    <activity 
     android:name="updated.activity.RegistrationActivity" 
     android:configChanges="orientation|screenSize" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/CustomAppTheme" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

どうすればこの問題を回避できますか?メインコードベースである更新されたコードベースからインテントフィルタを削除すると、Flavorは2つのアイコンをインストールしません。しかし、私はマニフェストのエントリポイントを宣言していないので、メインコードベースを実行することができません。逆に、インテントフィルタをFlavorから削除してメインコードベースに保持すると、Flavorコードは実行されません。 2つのRegistrationActivityクラスは、同じ名前で異なるだけです。レガシーコードは、実際には更新されたコードベースの多くを共有しません。異なるプロジェクトに分かれる以外の提案はありますか?

Flavorsでの設定をgradleで要求しているものもあれば、そのスナップショットもあります。

productFlavors { 
    standard { 
     applicationId 'updated.android.example' 
     manifestPlaceholders = [package_name: "updated.android.example", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
    legacyTest { 
     applicationId 'legacy.android.example.debug' 
     manifestPlaceholders = [package_name: "legacy.android.example.debug", 
           target  : "Test", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
    legacyProd { 
     applicationId 'legacy.android.example.prod' 
     manifestPlaceholders = [package_name: "legacy.android.example.prod", 
           target  : "Prod", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
+0

あなたを共有することができますgradleファイルも同様ですか? – Ichthyocentaurs

答えて

1

このライン:

<category android:name="android.intent.category.LAUNCHER"/> 

を使用すると、起動活性を有することを言います。それらをデフォルトのアクティビティ設定に設定します(これは単なる「別のアクティビティ」です)。ランチャクラスである第3のクラスを作成します。このクラスは、APIなど、あなたが持つ可能性のある仕様に基づいて、レベルまたはブランドを指定してください。起動する仕様が設定されていて、ユーザーは処理アクティビティがあることを知らないでしょう。

ランチャーアクティビティが2つある場合、2つのアプリケーションとして表示されます。私はメインCODEBで更新されたコードベースからインテントフィルタを削除した場合はどうすれば?これを回避することができる2つが起動するものに応じてありますので。

システムが自動的にリダイレクトするかを決定することはできませんase、

削除しないでください。それを変更。例えば:

 <intent-filter> 
      <action android:name="com.yourpackage.name.CLASSNAME" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
+0

はい、これはうまくいきました。ありがとうございました! – portfoliobuilder

1

あなたは2つの目録、それぞれの味のための1つを<activity android:name="legacy.activity.RegistrationActivity"を分離し、<activity android:name="updated.activity.RegistrationActivity"あなた必要があります。

例えば:

src/main/AndroidManifest.xml(除くすべてに:* .activity.RegistrationActivity)(updated.activity.RegistrationActivity付き)(legacy.activity.RegistrationActivity付き) src/legacy/AndroidManifest.xml src/updated/AndroidManifest.xml

関連する問題