0

Как создать намерение для деятельности в зависимости от вкуса?Android Flavor Intent Activity

Иерархия:

main 
-ActivityA 

flavor(free) 
-uses main/ActivityA 

flavor(paid) 
-uses own paid/ActivityA 

Так как создать Intent в зависимости от текущего вкуса?

+0

Вы можете добавить поле BuildConfig к каждому аромату и проверить 'if (field == free) {launch free} else {launch paid}' –

+0

Проблема в том, что бесплатная версия не знает платный пакет. – XxGoliathusxX

+0

, так что даже он не используется, он объявляет его как ошибку – XxGoliathusxX

ответ

2

Вы можете получить класс Activity по его названию. Таким образом, вы не получите ошибки компиляции:

Intent i = new Intent(this, Class.forName("com.xxx.packagename.paid.ActivityA")) 
-1

создает строить ароматы, как

productFlavors { 
    paid { 
      ... 
    } 
    free { 
      ... 
    } 
} 

    sourceSets { 
      main { 
       manifest.srcFile 'AndroidManifest.xml' 
       java.srcDirs = ['src'] 
       resources.srcDirs = ['src'] 
       aidl.srcDirs = ['src'] 
       renderscript.srcDirs = ['src'] 
       res.srcDirs = ['res'] 
       assets.srcDirs = ['assets'] 
      } 

      free { 
       java.srcDirs = ['free'] 
      } 
      paid{ 
       java.srcDirs = ['paid'] 
      } 
    } 

, а затем создать папки в

+ src 
+ main // this is your common code 
    + java 
    + res 
+ free 
    + java 
    + res 
+ paid 
    + java 
    + res 

так, когда вы строите со специфическим вкусом, Активности из определенной папки получает взяли. Таким образом, вы можете разместить оплаченную активность в платной папке и бесплатную активность в свободной папке.

0

Вы можете сделать много с ароматами, но то, что вы пытаетесь сделать, это гораздо проще, чем кто-нибудь ответил.

Сначала у вас есть вариант сборки, чтобы выбрать свой вкус для отладки и работы. Поэтому используйте это, иначе вся ваша отладка будет использовать основной выпуск по умолчанию.

Во-вторых, вам не нужно получать имя пакета, просто используйте флаг конфигурации сборки или проверьте вкус. И.Е.

android { 
    signingConfigs { 
     releaseA35Demo { 
      storeFile file("$projectDir/../yaskeystore.jks") 
      storePassword System.getenv('YOUR_APP_STUDIO_STORE_PASSWORD') 
      keyAlias System.getenv('YOUR_APP_STUDIO_KEY_ALIAS') 
      keyPassword System.getenv('YOUR_APP_STUDIO_KEY_PASSWORD') 
     } 
    } 

    flavorDimensions 'default' 

    productFlavors { 
     a35Demo { 
      dimension 'default' 
      applicationId "com.appstudio35.yourappstudio" 
      buildConfigField "String", "SERVER_URL", '"http://fakeNumbers.compute-1.amazonaws.com:3006"' 
      buildConfigField "int", "BUSINESS_ID", "1" 
      versionCode 1 
      versionName "0.01.01-b1" 
      minSdkVersion 21 
     } 
     a35DemoDev { 
      dimension 'default' 
      applicationId "com.appstudio35.yourappstudio.dev" 
      buildConfigField "String", "SERVER_URL", '"http://fakeNumbers2.compute-1.amazonaws.com:3006"' 
      buildConfigField "int", "BUSINESS_ID", "2" 
      versionCode 1 
      versionName "0.01.01-b1" 
      minSdkVersion 21 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

      productFlavors.a35Demo.signingConfig signingConfigs.releaseA35Demo 
      productFlavors.a35DemoDev.signingConfig signingConfigs.releaseA35Demo 
     } 
    } 
} 

Тогда просто ссылаться на него в коде, как:

BuildConfig.BUSINESS_ID 

Везде, где вам это нужно. Просто убедитесь, что вы случайно не используете BuildConfig проекта библиотеки, когда он автоматически импортирует BuildConfig.

Следующий способ, если вы хотите проверить свой вкус, вы можете просто сделать BuildConfig.FLAVOR, чтобы узнать, на каком из них вы находитесь. Однако имейте в виду, что есть некоторые предупреждения компилятора об использовании этого, потому что вы проверяете вкус, и BuildConfig предполагает, что он ВСЕГДА будет тем, что вы сейчас используете для раскрывающегося списка Build Variant, что неверно, вы можете игнорировать это всегда верно или всегда ложное предупреждение, я заверяю вас, что это работает.

Наконец, ваш пакет управляется вариантом сборки, который вы отлаживаете. Я добавлю изображение, чтобы вы могли видеть, где его изменить.

enter image description here

Надежда, что помогает.

Но последнее, что я скажу, это то, что ваша MainActivity будет автоматически обрабатываться, вам не нужно управлять пакетом для MainActivity, просто запустите его. Он будет использовать соответствующий аромат для того, в котором вы находитесь. Обычно, когда вы перемещаете файл в аромат, вы делаете свой аромат выпуска и ваши варианты, чтобы он использовал соответствующую MainActivity. То, что вы делаете, немного хаки, но я думаю, это работает. Тем не менее, рекомендуется рекомендовать, чтобы инструмент для ароматов выполнял свою работу и запускал его для вас.

Просто удалите MainActivity от Main и убедитесь, что он в ваших двух ароматах оплачен и свободен, и вы готовы к работе.