最近做了一个android的web容器模式的开发,使用的ijetty做服务容器,采用的android的展示形式,使用了sqlite数据库存储数据和xml存储数据的两种方式。
优势在于采用j2ee的开发模式,在android做出同样强大功能的应用,记录以下一些问题。
使用的html页面和android后台代码进行交互的部分:
为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。
映射Java对象到JavaScript对象上
mWebView = (WebView) findViewById(R.id.wv_content);
mWebView.setVerticalScrollbarOverlay(true);
final WebSettings settings = mWebView.getSettings();
settings.setSupportZoom(true);
//WebView启用Javascript脚本执行
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
//映射Java对象到一个名为”js2java“的Javascript对象上
//JavaScript中可以通过"window.js2java"来调用Java对象的方法
mWebView.addJavascriptInterface(new JSInvokeClass(), "js2java");
/**网页Javascript调用接口**/
class JSInvokeClass {
public void back() {
activity.finish();
}
}
2、JavaScript调用Java对象示例
调用上述JSInvokeClass类对象的back方法,如下:
window.js2java.back();
关于旋转屏幕的时候不想oncreate的方法.
Android手机屏幕自动旋转时,每次都会重新调用Activity的onCreate方法,但是在实际开发中,这一步往往没有必要,有时还会带来负面影响,可以用下面的方法去掉这个特性
首先在AndroidManifest.xml中在相应Activity中加入以下代码:
- android:configChanges="orientation|keyboardHidden"
android:configChanges="orientation|keyboardHidden"
然后在相应Activity的Java代码中重写下面的这个方法:
- @Override
- publicvoid onConfigurationChanged(Configuration newConfig) {
- // TODO Auto-generated method stub
- super.onConfigurationChanged(newConfig);
- if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
- }
- elseif (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
- }
- }
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
}
}
这样在屏幕自动旋转时就不会调用相应Activity的onCreate方法了
,再次点击退出电钮,才退出系统。。。
个人觉得当用户按下后退键时,出现"再按一次退出"的提示防止误操作比弹出一个对话框是会更人性化的。话不多说上代码:
第一种:重写onKeyDown来监听:
- long waitTime = 2000;
- long touchTime = 0;
- @Override
- publicboolean onKeyDown(int keyCode, KeyEvent event) {
- if(event.getAction() == KeyEvent.ACTION_DOWN && KeyEvent.KEYCODE_BACK == keyCode) {
- long currentTime = System.currentTimeMillis();
- if((currentTime-touchTime)>=waitTime) {
- Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
- touchTime = currentTime;
- }else {
- finish();
- }
- returntrue;
- }
- returnsuper.onKeyDown(keyCode, event);
- }
long waitTime = 2000;
long touchTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN && KeyEvent.KEYCODE_BACK == keyCode) {
long currentTime = System.currentTimeMillis();
if((currentTime-touchTime)>=waitTime) {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
touchTime = currentTime;
}else {
finish();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
第二种是重写onBackPressed方法直接监听返回键:
- long waitTime = 2000;
- long touchTime = 0;
- @Override
- publicvoid onBackPressed() {
- long currentTime = System.currentTimeMillis();
- if((currentTime-touchTime)>=waitTime) {
- Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
- touchTime = currentTime;
- }else {
- finish();
- }
- }
long waitTime = 2000;
long touchTime = 0;
@Override
public void onBackPressed() {
long currentTime = System.currentTimeMillis();
if((currentTime-touchTime)>=waitTime) {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
touchTime = currentTime;
}else {
finish();
}
}
实现代码是一样的只是重写的方法不同罢了。
如果你需要同时重写这两个方法,可能要注意一些问题啦!系统先是onKeyDown,如果return true了,就不会onBackPressed啦!
安卓4.0读取外置SD卡路径的问题:
使用api里面提供的 Environment.getExternalStorageDirectory(); 在我的真机上获取的路径是/mnt/sdcard/
其实我机器的外置SD卡的路径并不是这个,读取的这个路径是机器内置内存的路径。
通过网上的一个读取系统文件void.fsd 的第二列为sdcard的第三列为外置卡的路径,修改了一下 变成我想要的
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import android.os.Environment;
public class Dev_MountInfo {
/**
* ***
*/
public final String HEAD = "dev_mount";
public final String LABEL = "<label>";
public final String MOUNT_POINT = "<mount_point>";
public final String PATH = "<part>";
public final String SYSFS_PATH = "<sysfs_path1...>";
/**
* Label for the volume
*/
// private final int NLABEL = 1;
// /**
// * Partition
// */
// private final int NPATH = 2;
// /**
// * Where the volume will be mounted
// */
// private final int NMOUNT_POINT = 3;
// private final int NSYSFS_PATH = 4;
//
// private final int DEV_INTERNAL = 0;
// private final int DEV_EXTERNAL = 1;
private ArrayList<String> cache = new ArrayList<String>();
private static Dev_MountInfo dev;
private DevInfo info;
private final File VOLD_FSTAB = new File(Environment.getRootDirectory()
.getAbsoluteFile()
+ File.separator
+ "etc"
+ File.separator
+ "vold.fstab");
public static Dev_MountInfo getInstance() {
if (null == dev)
dev = new Dev_MountInfo();
return dev;
}
public String getInfo() {
// for(String str:cache)
// System.out.println(str);
if (null == info)
info = new DevInfo();
try {
initVoldFstabToCache();
} catch (IOException e) {
e.printStackTrace();
}
if (cache.size()==0)
return "nosdcard";
String sdpath="nosdcard";
for(int i = 0;i<cache.size(); i++){
String[] sds = cache.get(i).split(" ");
if(sds[1].toString().equals("sdcard")){
sdpath = sds[2];
break;
}
}
return sdpath+"/webapps/";
}
/**
* init the words into the cache array
* @throws IOException
*/
private void initVoldFstabToCache() throws IOException {
cache.clear();
BufferedReader br = new BufferedReader(new FileReader(VOLD_FSTAB));
String tmp = null;
while ((tmp = br.readLine()) != null) {
// the words startsWith "dev_mount" are the SD info
if (tmp.startsWith(HEAD)) {
cache.add(tmp);
}
}
br.close();
cache.trimToSize();
}
public class DevInfo {
private String label, mount_point, path, sysfs_path;
/**
* return the label name of the SD card
* @return
*/
public String getLabel() {
return label;
}
private void setLabel(String label) {
this.label = label;
}
/**
* the mount point of the SD card
* @return
*/
public String getMount_point() {
return mount_point;
}
private void setMount_point(String mount_point) {
this.mount_point = mount_point;
}
/**
* SD mount path
* @return
*/
public String getPath() {
return path;
}
private void setPath(String path) {
this.path = path;
}
/**
* "unknow"
* @return
*/
public String getSysfs_path() {
return sysfs_path;
}
private void setSysfs_path(String sysfs_path) {
this.sysfs_path = sysfs_path;
}
}
// public DevInfo getInternalInfo() {
// return getInfo(DEV_INTERNAL);
// }
//
// public DevInfo getExternalInfo() {
// return getInfo(DEV_EXTERNAL);
// }
}