☆ 预备知识:
1、关于JAR
基本介绍:
使用范围:
一个 JAR 文件可以用于
□ 用于发布和使用类库
□ 作为应用程序和扩展的构建单元
□ 作为组件、applet 或者插件程序的部署单位
□ 用于打包与组件相关联的辅助资源
相关特点:
□
安全性 可以对
JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以
检测代码是否被篡改过。
□
减少下载时间 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。
□
压缩 JAR 格式允许您压缩文件以提高存储效率。
□
传输平台扩展 Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。
☆ 回归正题:
存在问题:
TextView view = (TextView)this.findViewbyId(R.id.text01);
如果在导出jar的时候添加了res的目录,那使用jar的工程在导入jar后就编译不过了。同样的,manifast也不能打在jar里,必须手动添加到使用jar的工程的manifast中。比如jar是一个activity,那使用jar的工程就要在自己的manifast中添加这个activity的声明。不然startactivity会报错说manifast没有添加这个activity的。
解决方法一:
import android.content.Context;
public class MResource {
}
解决方法二:
另:JNI层不可被打包入jar包,只能同jar包一同提供给第三方并放入工程目录下的libs包中)。
LeeWidget源代码:
package com.esri.lee;
import java.io.IOException;
import java.io.InputStream;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.Log;
//import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class LeeWidgetActivity extends Activity {
public static int state = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLeeWidgetView(this));
}
public View getLeeWidgetView(final Context context) {
LayoutParams layoutParam_fillParent = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
LayoutParams layoutParam_wrapContent = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
RelativeLayout relativeLayout = new RelativeLayout(context);
relativeLayout.setLayoutParams(layoutParam_fillParent);
LinearLayout imageLinearLayout = new LinearLayout(context);
imageLinearLayout.setLayoutParams(layoutParam_fillParent);
// imageLinearLayout.setGravity(Gravity.CENTER);
ImageView imageEsri = new ImageView(context);
imageEsri.setImageBitmap(getBitmapFromAssets(context,"esri_image.png"));
imageLinearLayout.addView(imageEsri);
relativeLayout.addView(imageLinearLayout);
LinearLayout buttonLinearLayout = new LinearLayout(context);
buttonLinearLayout.setLayoutParams(layoutParam_fillParent);
buttonLinearLayout.setOrientation(LinearLayout.VERTICAL);
Button bnLog = new Button(context);
bnLog.setText("Log");
bnLog.setTextColor(Color.BLACK);
bnLog.setLayoutParams(layoutParam_wrapContent);
bnLog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("LeeWidget", "Just test.");
Toast.makeText(context, "Just test.",
Toast.LENGTH_SHORT).show();
}
});
buttonLinearLayout.addView(bnLog);
Button bnReadState = new Button(context);
bnReadState.setText("Read State");
bnReadState.setTextColor(Color.BLACK);
bnReadState.setLayoutParams(layoutParam_wrapContent);
bnReadState.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("LeeWidget", "State = " + state);
Toast.makeText(context, "State = " + state,
Toast.LENGTH_SHORT).show();
state++;
}
});
buttonLinearLayout.addView(bnReadState);
relativeLayout.addView(buttonLinearLayout);
return relativeLayout;
}
private Bitmap getBitmapFromAssets(Context context, String fileName) {
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
Bitmap bitmap = null;
try {
inputStream = assetManager.open(fileName);
bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
Log.d("LeeWidget", "get bitmap failed");
return null;
}
return bitmap;
}
}
AlanBuilder源代码:
package com.esri.alan;
import com.esri.lee.LeeWidgetActivity;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class BuilderMainActivity extends Activity {
ViewGroup viewGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = LayoutInflater.from(this);
viewGroup = (ViewGroup) inflater.inflate(R.layout.activity_main,null);
setContentView(viewGroup);
Button bn_test2 = (Button)findViewById(R.id.test2);
bn_test2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LeeWidgetActivity.state = 1000;
startActivity(new Intent(BuilderMainActivity.this, LeeWidgetActivity.class));
}
});
Button bn_test3 = (Button)findViewById(R.id.test3);
bn_test3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LeeWidgetActivity leeWidgetActivity = new LeeWidgetActivity();
LeeWidgetActivity.state = 10000;
viewGroup.addView(leeWidgetActivity.getLeeWidgetView(BuilderMainActivity.this));
setContentView(viewGroup);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}