Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 將Activity及其他類打包成jar包供第三方調用

Android 將Activity及其他類打包成jar包供第三方調用

編輯:關於Android編程


 在開發java工程時,一個項目可能分為多個模塊,為了實現模塊間的解耦和獨立,提高模塊的復用性,通常將項目按模塊分為多個java工程進行開發,最後通過jar包等工程依賴的方式實現系統集成,提高模塊的耦合和復用。

  現在開發Android項目通過實踐和總結,發現這種方式特別有必要,比如開發一個android端的視頻播放功能,肯定有播放和下載模塊,如果不分開放在一個工程裡面不斷的添加新的功能,產品的每一個研發都不斷的添加修改功能,最後維護越來越難,bug越來越多,並相互推诿,這種方式能避免這種情況,此為有點一。其二呢,下載模塊是很多APP都會用到的模塊,將其獨立出來不斷的完善和優化,可以變成一個組件給不同的APP使用,這就提高了模塊的代碼的解耦,提高的復用性,提高的工作效率,好處大大的哦。

  由於Android的特殊性,android不僅有java文件還有res文件,需要研究如何將資源文件以及Activity文件打包成jar文件供其他項目調用,最終多方嘗試,找到如下兩種解決方案。

方案一:

根據Android的官方文檔,將其中一個項目設置為引用庫,在另一個項目中添加這個庫的引用。

簡單的做法是

在被引用項目TestJar中的project.properties中添加一行

 android.library=true

在引用的項目TestMain的project.properties中添加

 android.library=false
 android.library.reference.1=../TestJar

其中1表示引用包的序號,“../TestJar”表示引用項目的路徑

在Eclipse中操作具體做法如下:

    把普通的android project設置成庫項目
    庫項目也是一個標准的Android項目,因此你先創建一個普通的Android項目,這個項目可以起任何的名稱,任何的包名,設置其他需要設置的字段等。
    接著把項目設置成庫項目,步驟如下:
    1)在Package Explorer中,鼠標右鍵項目文件夾(TestJar),點擊Properties。
    2)在Properties窗口選擇”Android“,Library屬性顯示在右下邊。
    3)把”is Library“單選框選上,在點擊Apply。
    4)點擊OK關閉Properties。
    這時,這個項目就變成庫項目了,當然純的java項目也可以變成庫項目,非常簡單,執行上面四步就OK了。其他程序項目就可以引用這個庫項目了。 \


    <喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+0v3Tw7/iz+7Evzxicj4KyOe5+8Tjv6q3orXE06bTw7PM0PLP69KqtffTw7/iz+7Ev9bQtcS0+sLrus3XytS0o6zSsmVhc3nFtqOs0v3Tw7K91ujI58/Co7o8YnI+CjGjqdTaUGFja2FnZSBFeHBsb3JlctbQo6zK87Hq09K8/M/uxL/OxLz+vNCjqFRlc3RKYXKjqaOsteO791Byb3BlcnRpZXOhozxicj4KMqOp1NpQcm9wZXJ0aWVztLC/2tGh1PGhsUFuZHJvaWShsKOsTGlicmFyecr00NTP1Mq+1NrT0s/Csd+hozxicj4KM6OpteO790FkZKOstPK/qsHLUHJvamVjdCBTZWxlY3Rpb2621Luwv/Khozxicj4KNKOptNO/ydPDtcS/4s/uxL/B0LHt1tDRodTx0qrM7bzTtcS/4s/uxL+jrLXju/dPS6GjPGJyPgo1o6m21Luwv/K52LHV1q6687Xju/dBcHBseaOso6jU2lByb3BlcnRpZXO0sL/ao6mhozxicj4KNqOpteO7909Lo6y52LHVUHJvcGVydGllc7Swv9qhozxicj4KzeqzydLUyc/B+bK9o6xFY2xpcHNlu+HW2L2oz+7Ev6OssNG/4s/uxL/W0LXExNrNrLD8uqy9+MiloaM8YnI+CjwvcD4KPHA+PGJyPgo8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20150302/2015030209421289.jpg" alt="\">

      如果你想增加多個庫項目的引用,使用up和down可以設置他們的相對的優先級和合並順序。工具在合並引用的庫的時候順序是從低優先級(列表的下面)到高優先級(列表的上面)。 如果不只一個庫定義了相同的資源ID,這個工具選擇資源時會選擇高優先級的資源。應用程序自身擁有最高的優先級。

      方案二:

      通過導出JAR包的方式供給其他項目去引用,沒有資源包就不多說了直接導出jar包就可以直接引用,下面說一下在有資源包存在的時候打包Jar及引用方式。

      實現步驟:

        我們新建一個工程TestJar,這個就是等下我們要打包成jar工程 \

          注意:MResource這個類很重要,主要是它的作用,利用反射根據資源名字獲取資源ID(其實系統也自帶了根據資源名字獲取資源ID的方法getResources().getIdentifier("main_activity", "layout", getPackageName());第一個參數是資源的名字,第二個參數是資源的類型,例如layout, string等,第三個是包名字)

          MRsource.java代碼如下:
          import android.content.Context;
          /**
           * 根據資源的名字獲取其ID值
           * 
           * @author yangzy
           */
          public class MResource {
              public static int getIdByName(Context context, String className, String name) {
                  String packageName = context.getPackageName();
                  Class r = null;
                  int id = 0;
                  try {
                      r = Class.forName(packageName + ".R");
                      Class[] classes = r.getClasses();
                      Class desireClass = null;
                      for (int i = 0; i < classes.length; ++i) {
                          if (classes[i].getName().split("\\$")[1].equals(className)) {
                              desireClass = classes[i];
                              break;
                          }
                      }
                      if (desireClass != null)
                          id = desireClass.getField(name).getInt(desireClass);
                  } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  } catch (IllegalArgumentException e) {
                      e.printStackTrace();
                  } catch (SecurityException e) {
                      e.printStackTrace();
                  } catch (IllegalAccessException e) {
                      e.printStackTrace();
                  } catch (NoSuchFieldException e) {
                      e.printStackTrace();
                  }
                  return id;
              }
          }
          import android.content.Context;
          
          public class Statistics {
          
          	public static Statistics mStatistics;
          	public static Context mContext;
          
          	public static Statistics getInstance() {
          		if (mStatistics == null) {
          			mStatistics = new Statistics();
          		}
          
          		return mStatistics;
          	}
          
          	public void init(Context context) {
          		this.mContext = context;
          		System.out.println("--Statistics---init--");
          	}
          
          	public void Login(int num) {
          		System.out.println("--Statistics---" + num);
          	}
          
          }


          TestUtilJar.java實現比較簡單一個圖片點擊後彈出一個Toast
          import android.app.Activity;
          import android.content.Context;
          import android.os.Bundle;
          import android.view.View;
          import android.view.View.OnClickListener;
          import android.widget.ImageView;
          import android.widget.Toast;
          
          public class TestUtilJar extends Activity {
          
              private ImageView imageView;
              private Context context;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(MResource.getIdByName(getApplication(), "layout", "jar_activity_main"));
                  context = this;
                  imageView = (ImageView) findViewById(MResource.getIdByName(getApplication(), "id",
                          "jar_imageView"));
                  imageView.setOnClickListener(new OnClickListener() {
          
                      @Override
                      public void onClick(View v) {
                          // TODO Auto-generated method stub
                          Toast.makeText(
                                  context,
                                  "jar = "
                                          + getApplication().getString(
                                                  MResource.getIdByName(getApplication(), "string",
                                                          "jar_test_name")), Toast.LENGTH_SHORT).show();
                      }
                  });
              }
          }


          布局文件如下:
          
          
              
          
          
          將TestJar以Jar包形式導出,出去一切資源文件,只導出源碼
          \\\

          6、將導出的testjar1.jar導入到要引用的工程中,先復制到libs下面

          最關鍵一步,將TestJar中引用到的資源文件全部拷貝到TestMain中去,這樣就可以順利的引用資源文件了,還有要用到Jar包中的Activity也需要再TestMain的AndroidManifest.xml配置對應包名的Activity。

          \


            在TestMain中引用
            package com.example.testmain;
            import com.example.testjar.TestUtilJar;
            
            import android.app.Activity;
            import android.content.Intent;
            import android.os.Bundle;
            import android.view.View;
            import android.view.View.OnClickListener;
            import android.widget.Button;
            
            public class MainActivity extends Activity implements OnClickListener {
                private Button button;
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    button = (Button) findViewById(R.id.button1);
                    button.setOnClickListener(this);
            	Statistics.getInstance().init(this);
            	Statistics.getInstance().Login(19911019);
                }
            
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    switch (v.getId()) {
                        case R.id.button1:
                            Intent intent = new Intent(this, TestUtilJar.class);
                            startActivity(intent);
                            break;
                    }
                }
            
            }

            同時在Manifest中注冊TestUtilJar 這個Activity
            android:name="com.example.selfjar.TestUtilJar"
            >


            方案一是官方提供的方法應該比較好適合自己公司開發和引用開源代碼,但是有的時候是需要給第三方公司提供支持的,當然這個時候不想他們看到我們的源代碼,這時候采用方案二是比較理想的。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved