2014-11-02 65 views
5

我有遷移到Android Studio將導致正在安裝「單一主項目中的多個庫項目」多個應用

定義 <action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
  • 多庫項目,其中一些定義
    • 單一主體工程<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />

    雖然我使用Eclipse來構建多庫項目&運行單一主體工程,僅1個應用將是安裝。

    但是,如果我遷移到Android Studio來創建多個庫項目&運行單一主體工程,多個應用將取決於有多少項目(不分主項目或庫項目)定義安裝

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

    我想知道,是否有任何配置我在Android Studio中做了錯事,這會導致要安裝多個應用程序,當我建立&運行的項目?

    目前,我唯一的解決辦法從所有庫項目AndroidManifest.xml刪除那些行(<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />)。那是常見的&正確的方式,在Android Studio中導入項目庫?在Eclipse中,這些行不會將額外的應用程序安裝到我的設備中。

    這是我項目結構的樣子

    enter image description here

    正如你所看到的第一個文件夾圖標,看上去比的文件夾圖標與衆不同。我想這表明,第一個文件夾圖標是主項目,其他的是圖書館項目。

    如果只有1個主項目,怎麼會有多個應用程序被安裝?

  • 回答

    7

    在從主應用程序的Eclipse項目只AndroidManifest.xml使用。在Android Studio(和Gradle構建系統)中,所有清單合併在一起。

    清單中<activity>元素內的以下行表明該活動應顯示在啓動器菜單中。如果您不希望這樣,請刪除這些行。

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

    所有這些都是預期的行爲。

    +0

    嗨,你有沒有關於「在Eclipse中只有主應用程序項目的AndroidManifest.xml被使用的任何參考鏈接。在Android Studio(和Gradle構建系統)中,所有的清單都合併在一起。」 ?謝謝 – 2014-11-09 10:20:02

    +0

    清單合併在Android Studio中默認啓用,並在Eclipse中禁用。 工作原理:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger 如何在Eclipse中啓用:http://stackoverflow.com/questions/10976635/using-the-new-manifestmerger-property-in-android – 2014-11-09 10:24:48

    +0

    只刪除第二部分: 2014-11-17 13:34:13

    1

    在Android studio中,他們一次只能添加一個項目。 如果你有圖書館項目,那麼你必須添加整個代碼在你的項目或 你可以爲你的圖書館項目創建jar,並將它們添加到你的項目。

    在Android studio中還有另一種gradle選項。 如果我們想在項目中使用任何庫,我們可以在Project的「build.gradle」文件中添加它們的依賴項。

    我附上「build.gradle」文件的屏幕截圖請參閱它。

    enter image description here

    現在,至於庫項目而言,(如果它不給你的項目貢獻),最好的辦法是,在Android清單,你應該只設置你定義的活動作爲一個啓動活動,作爲在大多數情況下,AndroidManifest庫。xml通常包含一些示例Activity(應該被刪除)或者Activity所需要的子類,圖書館項目中應該只有最少的定義(可以忽略),大部分的東西都應該包含在你的Manifest中,包括所有權限。

    而且它是在Android開發者網站定義

    「過濾器一個帶有‘android.intent.action.MAIN’和 ‘android.intent.category.LAUNCHER’設置通告活動作爲 一個啓動應用程序 - 也就是應該在應用程序啓動器中顯示 ,因此 過濾器中設置的圖標和標籤是啓動器中顯示的。

    你可以參考鏈接也... http://developer.android.com/guide/topics/manifest/manifest-intro.html

    +0

    我在Windows中使用Android Studio 0.8.14。我沒有看到您的繪製圖標指向的庫模塊複選框。 – 2014-11-04 15:43:32

    4

    還有另一種駭人聽聞的方式。

    1. 在您的合併AndroidManifest.xml中查找。它應該位於: <your_project>/build/intermediates/manifests/full/<debugOrRelease>/AndroidManifest.xml

    2. 搜索發射器<activity>標記。在你的情況下,你應該有超過1個LAUNCHER <activity>標籤。我的情況是這樣的:

      <activity 
          android:name="com.stockhut.SplashScreenActivity" 
          android:screenOrientation="portrait" > 
          <intent-filter> 
           <action android:name="android.intent.action.MAIN" > 
           </action> 
      
           <category android:name="android.intent.category.LAUNCHER" > 
           </category> 
          </intent-filter> 
      </activity> 
      ... 
      <activity 
          android:name="com.todddavies.components.progressbar.main" 
          android:label="@string/app_name" > 
          <intent-filter> 
           <action android:name="android.intent.action.MAIN" /> 
      
           <category android:name="android.intent.category.LAUNCHER" /> 
          </intent-filter> 
      </activity> 
      

    在我的情況,com.todddavies.components.progressbar.main是一個圖書館項目,已被宣佈爲LAUNCHER一個樣本項目。正確的LAUNCHER應該是com.stockhut.SplashScreenActivity

    在您的主項目
  • 打開AndroidManifest.xml中,添加以下內容:

    <activity 
        android:name="com.todddavies.components.progressbar.main" 
        android:label="@string/app_name" tools:node="remove" > 
        <intent-filter> 
         <action android:name="android.intent.action.MAIN" /> 
    
         <category android:name="android.intent.category.LAUNCHER" /> 
        </intent-filter> 
    </activity> 
    

    注意到關於標記tools:node="remove"。據Android Manifest Merger Documentation

  • 的標記是一個特殊的屬性,在工具的命名空間,用來表達對如何解決衝突的具體決定。

    因此,帶有標記tools:node="remove"<activity>標記將告訴Gradle在發生衝突時自行移除。換句話說,我們以某種方式「強迫衝突」。這是一個小黑客,但它的作品。

    您可以隨時驗證您的合併AndroidManifest。在上述路徑中的xml。

    相關問題