編輯:關於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中操作具體做法如下:
<喎?/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="\">
方案二:
通過導出JAR包的方式供給其他項目去引用,沒有資源包就不多說了直接導出jar包就可以直接引用,下面說一下在有資源包存在的時候打包Jar及引用方式。
實現步驟:
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; } }
TestUtilJar.java實現比較簡單一個圖片點擊後彈出一個Toastimport 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); } }
布局文件如下: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。
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"
>
方案一是官方提供的方法應該比較好適合自己公司開發和引用開源代碼,但是有的時候是需要給第三方公司提供支持的,當然這個時候不想他們看到我們的源代碼,這時候采用方案二是比較理想的。
前言EventBus框架 EventBus是一個通用的叫法,例如Google出品的Guava,Guava是一個龐大的庫,EventBus只是它附帶的一個小功能,因此實際項
由於android系統中應用程序之間不能共享內存。因此,在不同應用程序之間交互數據(跨進程通訊)就稍微麻煩一些。在android SDK中提供了4種用於跨進程通訊的方式。
本文實例講述了Android實現的截屏小程序。分享給大家供大家參考,具體如下:先看截圖,不過這個截屏還不夠完整,頭上的statusbar沒有,呈黑色。多按了幾次,就成這樣
不止一次在網上看到類似的新聞、丈夫出軌,為了不讓妻子發現手機裡存儲的數據,不惜格式化甚至砸壞手機,但妻子拿著格式化後的手機找到專門的數據恢復人員,幾天之後,