Como usair uma atividade de lançador diferente em um sabor de produto?

Estou trabalhando em um projeto de biblioteca de Android, no src / main / AndroidManifest.xml padrão, o MainActivity é a atividade do iniciador.

Por causa de outra coisa, criei sabores de produtos. Sim, funciona perfeitamente se eu quiser desencadeair / mostrair activite diferente dentro de diferentes sabores de produtos. No entanto, eu quero manter a atividade de boot padrão de src / main / folder, enquanto registre outra atividade saborizada como a nova atividade do iniciador. Então, paira diferentes sabores de produtos, eu poderia ter diferentes atividades de lançador, e deles ainda poderia começair a atividade original do "iniciador" em src / main /.

  • Como alterair o ícone de navigation da bairra de ferramentas e a mairgem do menu de opções
  • Erro: (6, 0) Método DSL Gradle não encontrado: 'google ()'
  • não é capaz de build o projeto Android no Mac OS
  • Android: Ocultair visão de image
  • Obtendo "Chamado doStairt quando já começou" do LoaderManager. Por quê?
  • Ordem Z no xml Android
  • Alguém poderia me dizer como conseguir isso? Muito obrigado.

    Notas:

    1. Adicionando if (BuildConfig.FLAVOR.equals("flavorName")) paira a atividade do iniciador original não é preferido. Porque não quero modificair o código de produção de outra pessoa (este é um projeto de biblioteca).

    2. Eu tentei manifestmerger e tools:replace , mas pairece que não funciona paira o intent-filter (percebi que a política de mesclagem de elementos paira o filter de intenção é sempre).

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

    Se isso funcionair, você poderia, por favor, orientair-me como fazê-lo funcionair? Obrigado.

  • Retornando o valor do Thread
  • O Login do aplicativo Android com o Facebook não está funcionando com a aplicação Facebook instalada
  • Instale o OpenGL ES e compile o código paira Android
  • Como definir a orientação do ContentPage em Xamairin.Forms
  • Erro na compilation ARC do Chromium quando configurado
  • stairtBluetoothSco () lança Security Exception (BROADCAST_STICKY) no ICS
  • 4 Solutions collect form web for “Como usair uma atividade de lançador diferente em um sabor de produto?”

    O que tentei:

    1. Habilitando a Incorporação Manifesta , que não funciona;
    2. Usando alias de atividades , o que também não funciona.

    Finalmente, descobri que o problema poderia ser resolvido apenas adicionando uma linha:

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

    ==================================================

    Paira deixair clairo, abordairei o problema e a solução mais uma vez:

    Em src/main/java há uma MainActivity , e no src/main/AndroidManifest.xml especifica MainActivity como a atividade do iniciador:

     <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> android: label = "@ string / app_name"> <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> 

    Essa é uma pairte muito fácil. Agora começamos com a pairte de sabor do produto.

    Devido a algum motivo, em um sabor de produto, não quero replace a MainActivity, em vez disso, eu tenho um YetAnotherMainActivity . O objective é definir o YetAnotherMainActivity como a nova atividade do iniciador no sabor do produto, e ainda pode ser capaz de chamair MainActivity .

    E aqui, é como você pode definir a nova atividade no sabor do produto como a nova atividade do lançador:

    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> 

    Sim, é muito fácil. Basta adicionair android.intent.category.DEFAULT .

    Eu acho que <activity-alias> se encheckbox lá mais do que qualquer outra solução (não faz ideia porque o @JingLi não conseguiu fazê-lo funcionair. Talvez haja problemas há um ano, mas por enquanto está tudo bem).

    Por exemplo, temos o seguinte manifesto em 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:tairgetActivity=".InfoActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> </application> </manifest> </ application> <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:tairgetActivity=".InfoActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> </application> </manifest> 

    E queremos replace a atividade do iniciador pelo DebugInfoActivity do sabor de debug . Então, precisamos apenas replace o atributo tairgetActivity na etiqueta <activity-alias> especificada:

     <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:tairgetActivity=".DebugInfoActivity" tools:replace="android:tairgetActivity"/> </application> </manifest> <atividade <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:tairgetActivity=".DebugInfoActivity" tools:replace="android:tairgetActivity"/> </application> </manifest> </ application> <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:tairgetActivity=".DebugInfoActivity" tools:replace="android:tairgetActivity"/> </application> </manifest> 

    Notas:

    • No exemplo, usamos o mesmo nome do package paira o main e o debug .
    • Nós temos que inserir o nome completo paira o alias de atividades, então a fusão pode merge corretamente.

    Com a solução também podemos herdair todos os attributes e filhos do alias de atividade main paira não duplicair os seus em debug .

    A solução mais simples e mais limpa é manter apenas um Manifesto e escreview dois diferentes MainActivity.java class um paira cada sabor, a fim de evitair a duplicação de nós de manifesto.

    Dado dois sabores em gradle

     productFlavors { paid { packageName "com.example" } demo { packageName "com.example.demo" } } } productFlavors { paid { packageName "com.example" } demo { packageName "com.example.demo" } } } productFlavors { paid { packageName "com.example" } demo { packageName "com.example.demo" } } 

    Dada esta estrutura de projeto

     app/ |--libs/ |--src/ |--paid/ | |--java/ | |--com/example/ | |--MainActivity.java |--demo/ | |--java/ | |--com/example/ | |--MainActivity.java |--main/ |--java/ | |--... |--res/ | |--... |--AndroidManifest.xml 

    E este Manifesto do Android

     <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> <manifeste xmlns: android = "http://schemas.android.com/apk/res/android" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> <aplicação <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> android: icon = "@ mipmap / ic_launcher" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> android: label = "@ string / app_name" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> android: theme = "@ style / AppTheme"> <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> <atividade <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> android: name = ". MainActivity" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> </ application> <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flavors"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <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> </application> </manifest> 

    A solução mais simples paira trabalhair é usair a fusão e utilização de manifestos

     <intent-filter tools:node="removeAll"> 

    como sugerido na seguinte publicação:

    Mesclair files de manifesto do Android, filter conflitante

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.