最近做了一个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); // } }
评论