【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
鼠标右键项目,然后属性,然后java buildpath 然后order and export 使android private librars处于勾选状态,让你的jar包也处于勾选状态
Android 如何调用外部 jar 包中的 Service
光引入jar包是不够的,你还需要在你的manifest文件中声明这个service
<service android:name="com.whatever.something.SomeService"/>
原文网址:http://blog.csdn.net/xiaanming/article/details/9257853
转载注明地址:http://blog.csdn.net/xiaanming/article/details/9257853
最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来替换里面的资源图片,文字等一些资源文件问题,我本来想这个简单,用两个工程直接替换里面的资源文件就行,老大说,这样子不好,如果要改需要改两个客户端,而且还麻烦,叫我将所有的Activity打成Jar包的形式,这样子我们改了里面的内容就直接发布Jar包出去,其他公司直接下载Jar来使用,这样子他们自己公司也能更好的维护。
所以我就想直接将Activity打成Jar包,可是在使用的过程中发现这样子根本行不通,因为如果Activity引用了布局文件的话,比如R.layout.XXX或者R.string.XXX,我们使用的时候会报资源ID未找到的异常,在官网上看到可以将另一个工程当做Libraryhttp://developer.android.com/tools/projects/projects-eclipse.html,可是这样子需要将源码给到人家,不能直接发布Jar包,貌似不是我要的那种情况,今天我教大家如果将Activity打成Jar包的形式
1.我们新建一个Android工程,取名为ActivityLibrary,这个就是等下我们需要打包成Jar的工程
注:MResource这个类很重要,主要是它的作用,利用反射根据资源名字获取资源ID(其实系统也自带了根据资源名字获取资源ID的方法getResources().getIdentifier("main_activity", "layout", getPackageName());第一个参数是资源的名字,第二个参数是资源的类型,例如layout, string等,第三个是包名字)
- package com.example.activitylibrary;
- import android.content.Context;
- /**
- * 根据资源的名字获取其ID值
- * @author mining
- *
- */
- 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是一个数组的时候,我们要用下面的方法
- 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,一个ImageView
- 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的布局
- <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目录,其他的都不勾选,如图
通过上面这几步我们就将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包和资源文件一起发出去,人家就可以调用可,如果你觉得我写的对你有帮助的话你就顶一下,谢谢!
【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)的更多相关文章
- Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...
- JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
本项目测试环境 JDK: 1.8 SpringBoot: 2.1 需求描述 当我们想要利用SpringBoot封装一套组件并发布给第三方使用时,我们就不得不考虑我们的组件能否被使用者正确引入使用,此处 ...
- SpringBoot打成jar包后无法读取resources资源文件
在项目中做了一个支付功能, 需要引入第三方渠道的配置文件config.xml用来初始化文件证书, 将配置文件 config.xml 放到 resources 资源目录下. 本地开发环境下能正常读取该文 ...
- Android将Activity 打 jar包 (解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- Android 将Activity殴打jar包 对于由第三方使用 解决XML 图片 文本资源并不难过进入jar包装问题!
做项目需要打包成jar文件供第三方使用项目要求(将图片 文字资源写到到jar包中,第三方调用时,仅须要在AndroidManifest.xml配置下对应的Activity通过StartActivity ...
- WEB应用打成jar包全记录
内容属原创,转载请注明出处 题外 由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程. 这个过程里用到了Spring和SpringM ...
- 将Android工程打成jar包之后对资源的调用。
Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. /** * 反射得到组件的id号 */ public static ...
随机推荐
- 使用strace查看C语言级别的php源码
XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...
- JS截取字符串方法
function textSubstr(str,sub_length){ str = str.trim(); var temp1 = str.replace(/[^\x00-\xff]/g," ...
- AvalonEdit 移除自身ScrollViewer (可配合外部自定义ScrollViewer 使用)
http://community.sharpdevelop.net/forums/p/11977/42764.aspx#42764 1: <Style TargetType="{x:T ...
- lesson8:AtomicInteger源码解析及性能分析
AtomicInteger等对象出现的目的主要是为了解决在多线程环境下变量计数的问题,例如常用的i++,i--操作,它们不是线程安全的,AtomicInteger引入后,就不必在进行i++和i--操作 ...
- oracle递归函数
oracle start with connect by 使用方法 oracle中 connect by prior 递归算法 Oracle中start with...connect by prio ...
- 常用渗透性测试工具(Tools for penetration testing)
常用渗透性测试工具 原文:http://hi.baidu.com/limpid/item/14a2df166adfa8cb38cb3068 对一个应用项目进行渗透性测试一般要经过三个步骤. 第一步, ...
- Python 线程池的原理和实现及subprocess模块
最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自 ...
- NPM与调试工具的使用
1)NPM 2)nodemon 自动监视文件的变化并重启应用 3)pm2 启动node,资源共享 4)node-inspector node调试工具 5)Chrome Developer Tools
- R语言编程艺术# 矩阵(matrix)和数组(array)
矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数.所以矩阵也是和向量一样,有模式(数据类型)的概念.(但反过来,向量却不能看作是只有一列或一行的矩阵. 数组(array)是R里更一 ...
- C#高级编程第1章-.NET体系结构
内容提要: (1)编译和运行面向对象.NET代码 (2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点 (3)值类型与引用类型 (4)数据类型化 (5) ...