最近做了一个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); // } }
相关推荐
简单介绍了android移动开发中常用的3中菜单:1 选项菜单 2 子菜单 3 上下文菜单
Android开发实战中常用安卓开发框架.docxAndroid开发实战中常用安卓开发框架.docxAndroid开发实战中常用安卓开发框架.docxAndroid开发实战中常用安卓开发框架.docxAndroid开发实战中常用安卓开发框架.docxAndroid...
比较全的android开发常用图片
180个Android开发常见问题、实用技巧及注意事项,有利于Android开发过程中少走弯路。
Android开发常见问题.doc Android开发常见问题 1. Android在eclipse下出现Failed to find an AVD compatible with target 'Android 1.5'. Launch aborted.错误 Failed to find an AVD compatible with target '...
184个Android开发常见问题、实用技巧及注意事项 184个Android开发常见问题、实用技巧及注意事项
Android开发比较常用的一些网络资源
java开发工作两年遇到的技术问题以及查找到的解决方案还有一些积累,涉及前端技术,android开发,java后台以及数据库sql优化,session共享,单点登录,kafka入门,websocket,线程安全等。
Android应用开发常见错误与对策 Android应用开发常见错误与对策 提纲 一、Android 总体框架介绍 1. Android历史 ...五、Android开发文化探讨 1. Android Design 文化 2. 做一个本分的APP 六、开放式讨论
Android开发环境搭建和常见问题的解决方法
android开发常用快捷键 android开发常用快捷键 android开发常用快捷键 android开发常用快捷键
Android开发常用类库
我自己收藏的Android开发中常用一些彩色图标集合,很实用的
2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装JDK和配置Java开发 环境 2.2.2 Eclipse的安装与汉化 2.2.3 SDK和ADT的安装和 配置 2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建Hello...
Android 3将Android的全部力量带到了平板计算平台!《Android平板电脑应用开发入门经典》向Android新手快速介绍了如何使用Android 3开发平板应用。...◆ 介绍如何使用Eclipse进行Android开发,如何使用Android模 拟器
Android开发中常用的工具类:获取UniqueId、全屏、隐藏任务栏等。
Android开发常用图标,应有尽有!包含了大量Android日常开发用到的图标。欢迎下载!非常感谢支持!
Android嵌入式智能操作系统是基于Linux内核和驱动的,对于HTC、华为等公司开发Android操作系统时,需要专门将Android移植到 特定硬件平台下,同时将必要的驱动进行编写及开发。...Google.Android开发入门与实战.rar
安卓开发中,经常需要一些adb命令,adb的shell命令和提交代码的git命令,本人平时积累