轉載註明地址: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
- package com.example.activitylibrary;
-
- import android.content.Context;
-
- 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;
- }
- }
當咱們的資源Id是一個數組的時候,咱們要用下面的方法eclipse
- public static int[] getIdsByName(Context context, String className, String name) {
- String packageName = context.getPackageName();
- Class r = null;
- int[] ids = null;
- 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) && (desireClass.getField(name).get(desireClass) != null) && (desireClass.getField(name).get(desireClass).getClass().isArray()))
- ids = (int[])desireClass.getField(name).get(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 ids;
- }
LibraryActivity這裏面比較簡單,一個Button,一個TextView,一個ImageViewide
- package com.example.activitylibrary;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
-
- public class LibraryActivity extends Activity {
- String msg = "我是來自Jar中的Activity";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(MResource.getIdByName(getApplication(), "layout", "activity_main"));
-
- TextView mTextView = (TextView) findViewById(MResource.getIdByName(getApplication(), "id", "textView1"));
- mTextView.setText(msg);
-
- Button mButton = (Button) findViewById(MResource.getIdByName(getApplication(), "id", "button1"));
-
- mButton.setText(msg);
- mButton.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- Toast.makeText(getApplication(), msg, Toast.LENGTH_SHORT).show();
- }
- });
- }
-
-
- }
Activity的佈局oop
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity" >
-
- <Button
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true" />
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@+id/button1" />
-
- <ImageView
- android:id="@+id/imageView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@+id/textView1"
- android:layout_marginTop="28dp"
- android:src="@drawable/ic_launcher" />
-
- </RelativeLayout>
2.咱們將ActivityLibrary工程打成Jar包。右鍵工程--->Export---->Java--->JAR file---->Next以下圖佈局
只勾選src目錄,其餘的都不勾選,如圖spa
經過上面這幾步咱們就將Android工程打包好了
3.咱們來使用剛剛打包好的Activity,咱們還須要剛剛那個工程的資源文件,由於咱們剛剛只打包了src,資源文件不能打包,所以咱們須要本身拿出來,咱們須要吧Library.jar加入到libs裏面去,而後用到的資源文件,若是layout,string之類的拷貝到對應工程的地方去
這個工程一個MainActivity,裏面一個按鈕,點擊按鈕跳轉到Library中的Activity中,比較簡單我直接把代碼貼上
- package com.example.androidlibraryinvoke;
-
- 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 {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Button mButton = (Button) findViewById(R.id.button1);
- mButton.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setClassName(getApplication(), "com.example.activitylibrary.LibraryActivity");
- startActivity(intent);
- }
- });
- }
-
-
- }
咱們須要在AndroidManifest.xml註冊LibraryActivity,不然報Activity找不到異常,整體來講就是這樣子,這樣子咱們將Activity打成的Jar包和資源文件一塊兒發出去,人家就能夠調用可,若是你以爲我寫的對你有幫助的話你就頂一下,謝謝!
代碼下載