`
1250605829
  • 浏览: 61772 次
  • 性别: 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);
//        }
        
}

 

 

分享到:
评论

相关推荐

    Android开发遇到的小问题总结,不断更新

    Android 开发中常见的小问题总结 一、 Android 开发中 ProgressBar 的问题 在 Android 开发中,我们经常会遇到 ProgressBar 的问题,例如在设置控件 ProgressBar 时出现 “cannot cast from view to progressbar”...

    安卓开发中的一些按钮图标

    "安卓开发中的一些按钮图标"这一主题着重于探讨如何利用图标提升安卓应用的用户体验和视觉吸引力。下面将详细讨论相关知识点。 首先,安卓系统支持多种图标格式,如PNG、SVG、XML等。PNG和SVG是常见的选择,其中PNG...

    安卓开发框架工具类相关-Android快速开发系列10个常用工具类.rar

    在Android开发中,工具类通常包含一系列静态方法,用于执行常见的、重复的任务,以提高代码的复用性和开发效率。这一压缩包很可能包含了开发者在日常工作中会频繁使用的各种功能模块。 【描述】中提到,这是一个...

    Android开发艺术探索PDF+源码+笔记

    这本书旨在帮助读者提升Android开发技能,掌握更多的实践技巧,以及理解Android系统的工作原理。PDF版本提供了一种方便的电子阅读方式,而源码和笔记则为学习过程提供了实际示例和作者的见解。 首先,书中涵盖了...

    Delphi10 Android开发环境配置.docx

    在 Delphi XE10 中开发 Android 应用程序时可能会出现一些问题,以下是常见的问题处理方法: 1. 安装 JDK 1.8 和 Android SDK。 2. 配置环境变量,包括 ANDROID_HOME 变量和 Path 变量。 3. 解决“'adb' 不是内部或...

    安卓开发准备工作

    本文档将详细介绍如何准备安卓开发环境,包括集成开发环境(IDE)、Java开发工具包(JDK)、Android开发工具插件(ADT)、Android SDK以及虚拟设备的配置方法。 #### 二、IDE:Eclipse 1. **下载Eclipse**: - ...

    Android开发实战中常用安卓开发框架.docx

    以下是一些在Android开发实战中常用的框架的详细介绍: 1. **Corona SDK**:这是一个使用Lua脚本进行跨平台开发的工具,允许开发者创建原生的Android应用程序。Corona SDK提供了一个模拟器进行测试,并且支持地图...

    安卓开发本地音乐播放器(Android Studio).zip

    在本项目中,我们主要探讨如何使用Android Studio开发一个本地音乐播放器,专注于安卓平台的Java编程技术。这个音乐播放器能够播放手机SD卡上的音乐,并提供了常见的播放控制功能,如开始、暂停、停止、播放、上一曲...

    184个Android开发常见问题、实用技巧及注意事项

    这份资料“184个Android开发常见问题、实用技巧及注意事项”正是为了帮助开发者解决这些问题而准备的。以下是部分可能涵盖的知识点: 1. **Activity生命周期**:理解Activity的创建、启动、暂停、恢复和销毁过程,...

    Android应用开发常见错误与对策

    Android应用开发常见错误与对策 Android应用开发常见错误与对策 提纲 一、Android 总体框架介绍 1. Android历史 ...五、Android开发文化探讨 1. Android Design 文化 2. 做一个本分的APP 六、开放式讨论

    java开发常见问题

    java开发工作两年遇到的技术问题以及查找到的解决方案还有一些积累,涉及前端技术,android开发,java后台以及数据库sql优化,session共享,单点登录,kafka入门,websocket,线程安全等。

    AndroidAPP开发入门教程.pdf

    Android APP 开发入门教程 ...* Android APP 开发中常见的问题和解决方案 通过本教程,读者可以快速掌握 Android APP 开发的基本技能,从开发环境搭建到项目编译和打包,具备了基本的 Android APP 开发能力。

    android开发工具常用包

    "android开发工具常用包"这个压缩包文件很可能包含了Android开发者日常工作中必不可少的一些工具和库。以下将详细解析这些工具包可能涉及的知识点: 1. Android Studio:作为Android官方推荐的集成开发环境(IDE)...

    安卓开发框架工具类相关-Android开发中使用到的开源工具包.zip

    "安卓开发框架工具类相关-Android开发中使用到的开源工具包.zip"这个压缩文件包含了多种常用的开源工具包,虽然可能无法确保每个都能直接运行,但它们提供了丰富的代码示例和学习资源。 首先,让我们了解一下Java...

    Android(安卓)开发全套112GB教程

    通过以上知识点的总结可以看出,这套112GB的Android开发教程不仅覆盖了理论知识,还有大量的实践操作指导,非常适合希望全面掌握Android开发技能的学习者。无论是对于刚刚入门的新手还是有一定经验的开发者,都能...

    Android开发环境搭建全程演示(jdk+eclip+android sdk)

    本文将详细介绍如何一步步配置Android开发环境,包括安装JDK、设置Eclipse以及获取和配置Android SDK。这个过程对于初学者至关重要,因为只有正确地搭建了环境,才能进行后续的编码和调试工作。 1. **Java ...

    Android开发常用类库

    本篇文章将详细探讨Android开发中的常用类库及其重要性。 首先,我们来看看“dc.androidlib”这个压缩包可能包含的内容。通常,这样的命名暗示着它是一个Android开发的第三方库集合,可能包含了多种实用工具类、UI...

    android开发常用工具类

    以上只是Android开发常用工具类的一部分,实际开发中可能还会涉及到网络请求、JSON解析、动画效果、权限管理等多个方面。熟练掌握这些工具类和相关技术,能帮助开发者更高效地完成项目开发,提升应用的用户体验。

Global site tag (gtag.js) - Google Analytics