`
1250605829
  • 浏览: 60326 次
  • 性别: Icon_minigender_1
  • 来自: 阜阳
社区版块
存档分类
最新评论

工作中安卓开发中常用的一些问题

阅读更多

最近做了一个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中加入以下代码:

  1. android:configChanges="orientation|keyboardHidden"
android:configChanges="orientation|keyboardHidden"


然后在相应Activity的Java代码中重写下面的这个方法:

 

  1. @Override
  2. publicvoid onConfigurationChanged(Configuration newConfig) {
  3. // TODO Auto-generated method stub
  4. super.onConfigurationChanged(newConfig);
  5. if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
  6. }
  7. elseif (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
  8. }
  9. }
	@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来监听:

  1. long waitTime = 2000;
  2. long touchTime = 0;
  3. @Override
  4. publicboolean onKeyDown(int keyCode, KeyEvent event) {
  5. if(event.getAction() == KeyEvent.ACTION_DOWN && KeyEvent.KEYCODE_BACK == keyCode) {
  6. long currentTime = System.currentTimeMillis();
  7. if((currentTime-touchTime)>=waitTime) {
  8. Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
  9. touchTime = currentTime;
  10. }else {
  11. finish();
  12. }
  13. returntrue;
  14. }
  15. returnsuper.onKeyDown(keyCode, event);
  16. }
        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方法直接监听返回键:

 

  1. long waitTime = 2000;
  2. long touchTime = 0;
  3. @Override
  4. publicvoid onBackPressed() {
  5. long currentTime = System.currentTimeMillis();
  6. if((currentTime-touchTime)>=waitTime) {
  7. Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
  8. touchTime = currentTime;
  9. }else {
  10. finish();
  11. }
  12. }
        
        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);
//        }
        
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics