2016-05-17 33 views
1

我有一個應用程序只有服務,接收者和活動不直接訪問的使用(沒有啓動器活動)。有條件地在AndroidManifest.xml中使用Gradle添加<activity>標記

但是現在我必須添加一個活動來用作啓動器活動但是只有當應用程序在BUILD期間設置了一些特定變量時,此啓動器活動才必須存在。

所以基本上,調用gradle這個構建時,我設置一個變量HAS_LAUNCHER=1和我的build.gradle我有類似:

defaultConfig { 
    ... 

    def hasLauncher = System.getenv("HAS_LAUNCHER") 
    if (hasLauncher != null && hasLauncher == "1") { 
     // Something here to include the activity tag in the AndroidManifest.xml 
    } 
} 

在我AndroidManifest我要當添加<activity>標籤if條件爲真:

<activity 
    android:name=".LauncherActivity" 
    android:label="Launcher" 
    android:theme="@style/AppTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity> 


如何可以完成,沒有使用機生產線的一個新的維度ctFlavors? (應用程序已經有3種口味和2個buildTypes尺寸,所以我不想賺更多的產出)

+1

一件事,你可以使用的是'啓用「屬性的活動標籤 – njzk2

+0

」這個啓動器活動必須存在「 - 在這種情況下,」存在「意味着什麼?你的意思是說這個活動只能在特定版本中啓用?順便說一句,你似乎在你的'


'之前缺少一些東西。 – CommonsWare

+0

@CommonsWare是的,發射器活動應該只在某些版本的apk中,而其他版本應該只有服務,接收器和其他活動。 (是的,我按了意外按鈕,但現在我編輯了這個問題) –

回答

1

可能爲時已晚,但經過多日尋找一個解決方案,我在這做了方式:

gradle這個defaultConfig

defaultConfig { 
    resValue "bool", "showActivity", "true" 
... 

在builTypes

buildTypes { 
    release { 
     resValue "bool", "showActivity", "false" 
     debuggable false 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 

在清單

<activity 
    android:name="xxx.xx.xxx" 
     android:enabled="@bool/showActivity" 
     android:label="@string/myActivity" 
     android:icon="@android:drawable/ic_menu_preferences"> 
    ... 

這樣您就可以控制gradle中的活動可見性。請注意,您也可以在代碼中使用,只需創建一個布爾資源showActivity,它將被gradle這個值來代替,你就可以讀取它

context.getResources().getBoolean(R.bool.showActivity) 
相關問題