【问题标题】:Android Flavor Intent ActivityAndroid 风格 Intent 活动
【发布时间】:2018-02-16 04:20:29
【问题描述】:

如何根据风格为活动创建意图?

层次结构:

main
-ActivityA

flavor(free)
-uses main/ActivityA

flavor(paid)
-uses own paid/ActivityA

那么如何根据当前的flavor创建一个Intent呢?

【问题讨论】:

  • 您可以为每个风味添加一个 BuildConfig 字段,并检查if (field == free) {launch free} else {launch paid}
  • 问题是免费版不知道付费包。
  • so Intent(this, Class.forName("com.xxx.packagename.paid"))?
  • Intent(this, Class.forName("com.xxx.packagename.paid.ActivityA"))
  • 好的,我会测试一下

标签: android android-intent android-activity android-productflavors


【解决方案1】:

您可以通过名称获取 Activity 类。这样你就不会得到编译错误:

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

【讨论】:

    【解决方案2】:

    你可以用口味做很多事情,但你想做的事情比任何人都回答的要简单得多。

    首先,您有一个构建变体来选择您的风格以进行调试和运行。所以使用这个,否则你所有的调试都将使用默认的主版本。

    其次,您不必获取软件包名称,只需使用构建配置标志或检查风味。即。

        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 下拉列表中的任何内容,这不是真的,您可以忽略这一点总是正确的或者总是错误的警告,我向你保证它有效。

    最后,您的包是由您正在调试的构建变体驱动的,我将添加一个图像,以便您查看在哪里进行更改。

    希望对您有所帮助。

    但我要说的最后一件事是您的 MainActivity 将被自动处理,您不必管理 MainActivity 的包,只需启动它即可。它会为你所在的那个使用各自的风格。通常,当你将一个文件移动到一个风格时,你会创建你的发布风格和你的变体,以便它将使用各自的 MainActivity。你在做什么有点hacky,但我想它有效。但是,建议让风味工具完成工作并为您启动它。

    只需从 Main 中删除 MainActivity 并确保它具有付费和免费两种风格,一切顺利。

    【讨论】:

      【解决方案3】:

      创建构建风格

      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
      

      因此,当您使用特定风格构建时,会选择特定文件夹中的 Activity。因此,您可以将付费活动放在付费文件夹中,将免费活动放在免费文件夹中。

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多