Android將Activity打成jar包供第三方調用(解決資源文件不能打包的問題)

轉載註明地址:http://blog.csdn.net/xiaanming/article/details/9257853html

最近有一個須要,咱們公司作了一個apk客戶端,而後其餘的公司能夠根據本身的須要來替換裏面的資源圖片,文字等一些資源文件問題,我原本想這個簡單,用兩個工程直接替換裏面的資源文件就行,老大說,這樣子很差,若是要改須要改兩個客戶端,並且還麻煩,叫我將全部的Activity打成Jar包的形式,這樣子咱們改了裏面的內容就直接發佈Jar包出去,其餘公司直接下載Jar來使用,這樣子他們本身公司也能更好的維護。java

因此我就想直接將Activity打成Jar包,但是在使用的過程當中發現這樣子根本行不通,由於若是Activity引用了佈局文件的話,好比R.layout.XXX或者R.string.XXX,咱們使用的時候會報資源ID未找到的異常,在官網上看到能夠將另外一個工程當作Libraryhttp://developer.android.com/tools/projects/projects-eclipse.html,但是這樣子須要將源碼給到人家,不能直接發佈Jar包,貌似不是我要的那種狀況,今天我教你們若是將Activity打成Jar包的形式android

1.咱們新建一個Android工程,取名爲ActivityLibrary,這個就是等下咱們須要打包成Jar的工程數組


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

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片eclipse

  1. package com.example.activitylibrary;  ide

  2.   

  3. import android.content.Context;  佈局

  4.   

  5. /** spa

  6.  * 根據資源的名字獲取其ID值 .net

  7.  * @author mining 

  8.  * 

  9.  */  

  10. public class MResource {  

  11.     public static int getIdByName(Context context, String className, String name) {  

  12.         String packageName = context.getPackageName();  

  13.         Class r = null;  

  14.         int id = 0;  

  15.         try {  

  16.             r = Class.forName(packageName + ".R");  

  17.   

  18.             Class[] classes = r.getClasses();  

  19.             Class desireClass = null;  

  20.   

  21.             for (int i = 0; i < classes.length; ++i) {  

  22.                 if (classes[i].getName().split("\\$")[1].equals(className)) {  

  23.                     desireClass = classes[i];  

  24.                     break;  

  25.                 }  

  26.             }  

  27.   

  28.             if (desireClass != null)  

  29.                 id = desireClass.getField(name).getInt(desireClass);  

  30.         } catch (ClassNotFoundException e) {  

  31.             e.printStackTrace();  

  32.         } catch (IllegalArgumentException e) {  

  33.             e.printStackTrace();  

  34.         } catch (SecurityException e) {  

  35.             e.printStackTrace();  

  36.         } catch (IllegalAccessException e) {  

  37.             e.printStackTrace();  

  38.         } catch (NoSuchFieldException e) {  

  39.             e.printStackTrace();  

  40.         }  

  41.   

  42.         return id;  

  43.     }  

  44. }  

當咱們的資源Id是一個數組的時候,咱們要用下面的方法

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. public static int[] getIdsByName(Context context, String className, String name) {  

  2.     String packageName = context.getPackageName();  

  3.     Class r = null;  

  4.     int[] ids = null;  

  5.     try {  

  6.       r = Class.forName(packageName + ".R");  

  7.   

  8.       Class[] classes = r.getClasses();  

  9.       Class desireClass = null;  

  10.   

  11.       for (int i = 0; i < classes.length; ++i) {  

  12.         if (classes[i].getName().split("\\$")[1].equals(className)) {  

  13.           desireClass = classes[i];  

  14.           break;  

  15.         }  

  16.       }  

  17.   

  18.       if ((desireClass != null) && (desireClass.getField(name).get(desireClass) != null) && (desireClass.getField(name).get(desireClass).getClass().isArray()))  

  19.         ids = (int[])desireClass.getField(name).get(desireClass);  

  20.     }  

  21.     catch (ClassNotFoundException e) {  

  22.       e.printStackTrace();  

  23.     } catch (IllegalArgumentException e) {  

  24.       e.printStackTrace();  

  25.     } catch (SecurityException e) {  

  26.       e.printStackTrace();  

  27.     } catch (IllegalAccessException e) {  

  28.       e.printStackTrace();  

  29.     } catch (NoSuchFieldException e) {  

  30.       e.printStackTrace();  

  31.     }  

  32.   

  33.     return ids;  

  34.   }  


LibraryActivity這裏面比較簡單,一個Button,一個TextView,一個ImageView

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. package com.example.activitylibrary;  

  2.   

  3. import android.app.Activity;  

  4. import android.os.Bundle;  

  5. import android.view.View;  

  6. import android.view.View.OnClickListener;  

  7. import android.widget.Button;  

  8. import android.widget.TextView;  

  9. import android.widget.Toast;  

  10.   

  11. public class LibraryActivity extends Activity {  

  12.     String msg = "我是來自Jar中的Activity";  

  13.   

  14.     @Override  

  15.     protected void onCreate(Bundle savedInstanceState) {  

  16.         super.onCreate(savedInstanceState);  

  17.         setContentView(MResource.getIdByName(getApplication(), "layout""activity_main"));  

  18.           

  19.         TextView mTextView = (TextView) findViewById(MResource.getIdByName(getApplication(), "id""textView1"));  

  20.         mTextView.setText(msg);  

  21.           

  22.         Button mButton = (Button) findViewById(MResource.getIdByName(getApplication(), "id""button1"));  

  23.           

  24.         mButton.setText(msg);  

  25.         mButton.setOnClickListener(new OnClickListener() {  

  26.               

  27.             @Override  

  28.             public void onClick(View v) {  

  29.                 Toast.makeText(getApplication(), msg, Toast.LENGTH_SHORT).show();  

  30.             }  

  31.         });  

  32.     }  

  33.   

  34.   

  35. }  

Activity的佈局

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  2.     xmlns:tools="http://schemas.android.com/tools"  

  3.     android:layout_width="match_parent"  

  4.     android:layout_height="match_parent"  

  5.     tools:context=".MainActivity" >  

  6.   

  7.     <Button  

  8.         android:id="@+id/button1"  

  9.         android:layout_width="wrap_content"  

  10.         android:layout_height="wrap_content"  

  11.         android:layout_alignParentLeft="true"  

  12.         android:layout_alignParentRight="true"  

  13.         android:layout_alignParentTop="true" />  

  14.   

  15.     <TextView  

  16.         android:id="@+id/textView1"  

  17.         android:layout_width="wrap_content"  

  18.         android:layout_height="wrap_content"  

  19.         android:layout_alignParentLeft="true"  

  20.         android:layout_alignParentRight="true"  

  21.         android:layout_below="@+id/button1" />  

  22.   

  23.     <ImageView  

  24.         android:id="@+id/imageView1"  

  25.         android:layout_width="wrap_content"  

  26.         android:layout_height="wrap_content"  

  27.         android:layout_alignParentBottom="true"  

  28.         android:layout_alignParentLeft="true"  

  29.         android:layout_alignParentRight="true"  

  30.         android:layout_below="@+id/textView1"  

  31.         android:layout_marginTop="28dp"  

  32.         android:src="@drawable/ic_launcher" />  

  33.   

  34. </RelativeLayout>  

2.咱們將ActivityLibrary工程打成Jar包。右鍵工程--->Export---->Java--->JAR file---->Next以下圖



只勾選src目錄,其餘的都不勾選,如圖

經過上面這幾步咱們就將Android工程打包好了

3.咱們來使用剛剛打包好的Activity,咱們還須要剛剛那個工程的資源文件,由於咱們剛剛只打包了src,資源文件不能打包,所以咱們須要本身拿出來,咱們須要吧Library.jar加入到libs裏面去,而後用到的資源文件,若是layout,string之類的拷貝到對應工程的地方去


這個工程一個MainActivity,裏面一個按鈕,點擊按鈕跳轉到Library中的Activity中,比較簡單我直接把代碼貼上

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. package com.example.androidlibraryinvoke;  

  2.   

  3. import android.app.Activity;  

  4. import android.content.Intent;  

  5. import android.os.Bundle;  

  6. import android.view.View;  

  7. import android.view.View.OnClickListener;  

  8. import android.widget.Button;  

  9.   

  10. public class MainActivity extends Activity {  

  11.   

  12.     @Override  

  13.     protected void onCreate(Bundle savedInstanceState) {  

  14.         super.onCreate(savedInstanceState);  

  15.         setContentView(R.layout.main);  

  16.           

  17.         Button mButton = (Button) findViewById(R.id.button1);  

  18.         mButton.setOnClickListener(new OnClickListener() {  

  19.               

  20.             @Override  

  21.             public void onClick(View v) {  

  22.                 Intent intent = new Intent();  

  23.                 intent.setClassName(getApplication(), "com.example.activitylibrary.LibraryActivity");  

  24.                 startActivity(intent);  

  25.             }  

  26.         });  

  27.     }  

  28.   

  29.   

  30. }  

咱們須要在AndroidManifest.xml註冊LibraryActivity,不然報Activity找不到異常,整體來講就是這樣子,這樣子咱們將Activity打成的Jar包和資源文件一塊兒發出去,人家就能夠調用可,若是你以爲我寫的對你有幫助的話你就頂一下,謝謝!

代碼下載

相關文章
相關標籤/搜索