对于Android平台上的数据库而言使用了嵌入式越来越流行的SQLite,为了更好的跨平台我们推荐大家使用原始SQL语句直接操作,在代码和处理效率上都有不小的提高,不过要做好SQL语句异常处理。 下面我们说下rawQuery的好处,可以看到查询的代码直接使用SQL语句,通过性能实测效率比Android封装过的类要快不少,但不能配合一些Adapter的使用,不过总体上在跨平台上很突出,下面为本地使用方法的伪代码,没有做任何构造和实例化,希望让项目经理知道rawSQL的优势在Android平台上的使用。 SQLiteDatabase db; String args[] = {id}; ContentValues cv = new ContentValues(); cv.put("android123", id); Cursor c = db.rawQuery("SELECT * FROM table WHERE android123=?", args); 执行本地SQL语句查询 if (c.getCount() != 0) { //dosomething ContentValues cv = new ContentValues(); cv.put("android123","cwj"); db.insert("table", "android123", cv); //插入数据 String args[] = {id}; ContentValues cv2= new […]
Android
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]
Android Rootkit相关揭秘 Android开发技术
Android Rootkit可能导致了近期部分安全公司开始涉及Android平台的安全软件研发,比如全球著名的反病毒软件Norton的母公司Symantec赛门铁克推出了一款基于该平台的安全产品。 Rootkit是内核的后门,如果你了解反病毒技术在Win32上我们可能还记得一些敏感的话题,比如说内核驱动,Hook SSDT等技术来实现安全监控,从目前来看Vista以后的UAC以及Linux的ACL控制几乎限制了这些内核驱动在常规账号下的加载,但是Android123提示大家越狱的Root权限手机可能存在十分大的安全漏洞,目前我们可以通过NDK开发一些安全敏感的软件,比如说键盘记录的Rootkit,比如在/dev/input中可以处理用户的一些输入输出事件,对于Root权限的机器可以随便的通过su获取高权限,执行iptables来阻止用户的接入,当然通过chmod改变一些目录的权限,获取其他用户的uid,危急整个Android设备的安全。 对于Android平台上的Rootkit的检测对于普通用户,在类似Win32的Ring3层上很难读取一些敏感指纹数据来判断,不过是后门存在可以断定,必然存在线程,文件系统上还是需要读写的,一般作为后面还是监听一些端口实现远程的控制。 Android平台的Rootkit是如何被植入的呢? 相对于iPhone App Store而言,Android的Market相对自由,同时用户可以从非Market上安装软件,所以少了人工审核出现一些问题是正常的,不过按照目前移动软件的开发人员来看出现病毒开发者短期内还不会出现。
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]
Android程序完全退出的三种方法 Android开发技术
很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现。 首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看Android开发网是如何实现的吧. 1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。 System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出 2. 任务管理器方法 首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可,直接使用ActivityManager类的restartPackage方法即可,参数为package name,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。 3. 根据Activity的声明周期 我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。 在A窗口中使用下面的代码调用B窗口 Intent intent = new Intent(); intent.setClass(Android123.this, CWJ.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置startActivity(intent); 接下来在B窗口中需要退出时直接使用finish方法即可全部退出。 如果您有更好的建议可以联系 android123@163.com 我们及时补充。
EditText中显示隐藏Android输入法窗口 Android开发技术
细心的网友可能发现我们在使用EditText时,会自动的弹出输入法面板,这里我们提供多种方法可以不让程序默认升起IME窗口。 1.让EditText失去焦点,使用EditText的clearFocus方法 2. 强制隐藏Android输入法窗口,在IME类中我们通过 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 实例化输入法控制对象,通过hideSoftInputFromWindow来控制,其中第一个参数绑定的为需要隐藏输入法的EditText对象,比如imm.hideSoftInputFromWindow(etAndroid123.getWindowToken(), 0);
Android中内嵌字体实现个性化 Android开发技术
在Android中我们的应用可以灵活的内嵌自己的字体文件,实现各个手机上可以正常的显示个性化文字,我们都知道TextView的setTypeface方法可以设置目标文字的显示特性,比如字体、颜色、粗体、斜体等。我们直接找一个TrueTypeFont的字体文件即.ttf,对于Win32系统的用户可以直接在Windows/fonts文件夹中能找到很多。比如微软雅黑就不错,可是体积太大,由于Android的Assets类有单个文件1MB体积的限制,我们先找个英文字体做测试。这里我们将字体文件android123.ttf放到工程的assets文件夹的fonts目录中。 Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/android123.ttf"); TextView tv = (TextView)findViewById(R.id.text); tv.setTypeface(tf); //设置TextView的风格 tv.setText("CWJ Test"); tv.setTextSize(12); tv.setTextColor(Color.RED);
Android中Intent对应的category列表大全 Android开发技术
在Android中使用Intent对应的category列表最全版本如下,更新到了Android 2.2 API Level8,Android123提示注意后面部分固件必须相应版本才可以调用 Android 1.5、1.6 android.intent.category.ALTERNATIVE android.intent.category.BROWSABLE android.intent.category.DEFAULTandroid.intent.category.DEVELOPMENT_PREFERENCE android.intent.category.EMBED android.intent.category.HOME android.intent.category.INFO android.intent.category.LAUNCHER android.intent.category.MONKEY android.intent.category.OPENABLE android.intent.category.PREFERENCE android.intent.category.SELECTED_ALTERNATIVE android.intent.category.TAB Android 2.0,2.0.1,2.1 新增车座和充电座 android.intent.category.CAR_DOCK android.intent.category.DESK_DOCK Android 2.2 新增行车模式 android.intent.category.CAR_MODE
Android Intent大全更新到API Level8 Android开发技术
对于Android开发者而言Intent可以帮助我们快速的处理隐式调用,相关的action列表大全如下,可以帮助最近给Android123邮件的网友解决一些问题: Android 1.5 API Level3 android.intent.action.ALL_APPS android.intent.action.ANSWER android.intent.action.ATTACH_DATA android.intent.action.BUG_REPORT android.intent.action.CALL android.intent.action.CALL_BUTTON android.intent.action.CHOOSER android.intent.action.CREATE_LIVE_FOLDER android.intent.action.CREATE_SHORTCUT android.intent.action.DELETE android.intent.action.DIAL android.intent.action.EDIT android.intent.action.GET_CONTENT android.intent.action.INSERT android.intent.action.INSERT_OR_EDIT android.intent.action.MAIN android.intent.action.MEDIA_SEARCH android.intent.action.PICK android.intent.action.PICK_ACTIVITY android.intent.action.RINGTONE_PICKER android.intent.action.RUN android.intent.action.SEARCH android.intent.action.SEARCH_LONG_PRESS android.intent.action.SEND android.intent.action.SENDTO android.intent.action.SET_WALLPAPER android.intent.action.SYNC android.intent.action.SYSTEM_TUTORIAL android.intent.action.VIEW android.intent.action.VOICE_COMMAND android.intent.action.WEB_SEARCH android.net.wifi.PICK_WIFI_NETWORK android.settings.AIRPLANE_MODE_SETTINGS android.settings.APN_SETTINGS android.settings.APPLICATION_DEVELOPMENT_SETTINGS android.settings.APPLICATION_SETTINGS android.settings.BLUETOOTH_SETTINGS android.settings.DATA_ROAMING_SETTINGS android.settings.DATE_SETTINGS android.settings.DISPLAY_SETTINGS android.settings.INPUT_METHOD_SETTINGS android.settings.INTERNAL_STORAGE_SETTINGS android.settings.LOCALE_SETTINGS android.settings.LOCATION_SOURCE_SETTINGS android.settings.MANAGE_APPLICATIONS_SETTINGS android.settings.MEMORY_CARD_SETTINGS android.settings.NETWORK_OPERATOR_SETTINGS android.settings.QUICK_LAUNCH_SETTINGS […]
Android程序内存管理必读 Android开发技术
很多开发者都是从J2ME或J2EE上过来的,对于内存的使用和理解并不是很到位,Android开发网本次给大家一些架构上的指导,防止出现豆腐渣工程的出现。Android作为以Java语言为主的智能平台对于我们开发一些高性能和质量的软件来说了解Android程序内存管理机制是必须的。 Android的Dalvik VM在基础方面和Sun JVM没有什么大的区别仅仅是字节码的优化,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。 1.对于常规开发者而言需要了解 Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。 2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里Android123提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。 3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,获取更多的运行内存。 4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。 5. 不要在循环中创建过多的本地变量。 有关Android和Java的系统性能分析,Android123将在以后的文章中详细讲述如何调试Java分析内存泄露以及Android上的gdb调试器分析得出内存性能改进。
Android游戏开发之旅15 按键中断处理 Android开发技术
有关Android平台上游戏开发中我们需要处理一些特别的按键事件,对于突发的事情我们需要特别的考虑,比如突然来电话了和游戏中按下一些特殊的键,比如拍照键 @Override public boolean dispatchKeyEvent(KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_VOLUME_UP: //音量键+ case KeyEvent.KEYCODE_VOLUME_DOWN: //音量键- case KeyEvent.KEYCODE_CAMERA: //拍照键 case KeyEvent.KEYCODE_FOCUS: //拍照键半按的对焦状态 // event.getAction() == KeyEvent.ACTION_UP //Android123提示如果按键按下后弹起时触发 } return true; //这些标记为处理过,则不在往内部传递 default: break; } return super.dispatchKeyEvent(event); } 对于游戏突然来电话我们一般采取通过PhoneStateListener类提供的public void onCallStateChanged (int state, String incomingNumber) 回调方法可以获取电话的状态,比如常规空闲时CALL_STATE_IDLE、来电时CALL_STATE_RINGING和CALL_STATE_OFFHOOK 摘机通话中,有关处理的细节网友可以查看Android Git项目中的Music,在Android开源项目中系统自带的音乐播放器可以很好的处理,比如在通话结束后恢复音乐播放,而我们游戏需要做的就是记住当前的游戏状态尽量数据持久化处理,不能因为长时间的通话,游戏的Activity被清理了,这里我们一般通过onSaveInstanceState来保存当前窗口的一些记录,通过Intent标记来让系统管理好我们游戏的生命周期。
Android多线程下载远程图片 Android开发技术
很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载。 方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection或URLConnection也可以。 static Bitmap downloadBitmapByCwj(String url) { final AndroidHttpClient client = AndroidHttpClient.newInstance("Android123"); final HttpGet getRequest = new HttpGet(url); try { HttpResponse response = client.execute(getRequest); final int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_OK) { Log.e("cwjDebug", "Error " + statusCode + " while retrieving […]

android调试工具monkey压力测试实战 Android开发技术
很多Android开发者可能因为没有充分测试自己的软件造成很容易出现FC(Force Close)的问题,这里我们可以通过使用Android固件中自带的monkey工具来做软件的压力测试,monkey工具可以模拟各种按键,触屏,轨迹球、activity等事件,这里Android123提示大家说白了monkey就是一个小猴子随机狂玩你的android软件,看看会不会产生异常。 具体的使用我们通过Android SDK给我们的adb调试桥链接设备或模拟器,进入Linux Shell状态,当然我们可以输入adb shell获取设备的shell,也可以直接通过adb命令执行,比如说adb shell monkey来查看monkey工具中的参数说明,如图: 我们要测试的apk文件要在android设备中已经安装,当然模拟器中也可以测试的。执行adb shell monkey -p cn.com.android123.cwj -v 100 我们执行这句的中包含了p参数,这里代表已安装软件的packageName,而v代表查看monkey生成的详细随机事件名,最后的数字100为我们测试的随机事件数量为100.有关更多的测试方法,请查看上图中的参数,整个测试比较简单单很有效,不妨试试。
Android Txt文本读写类源代码 Android开发技术
Android系统内部提供了一个不错的txt文本读写类,但目前并没有公开提供给标准的SDK,FileUtils类的源代码如下,可以很好的操作Linux下的文本文件。 public class FileUtils{ public static final int S_IRWXU = 00700; public static final int S_IRUSR = 00400; public static final int S_IWUSR = 00200; public static final int S_IXUSR = 00100; public static final int S_IRWXG = 00070; public static final int S_IRGRP = 00040; public static final int S_IWGRP = 00020; […]
Android通过Intent发送电子邮件含附件 Android开发技术
如何在Android系统中发送带附件的电子邮件呢? 其实通过Intent可以很方便的发送Email,只需要短短10行代码就可以处理,这里Android开发网就以在sdcard上的android123.cwj文件为例,通过Intent来发送电子邮件。完整代码如下 File file = new File("\sdcard\android123.cwj"); //附件文件地址 Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra("subject", file.getName()); // intent.putExtra("body", "android123 – email sender"); //正文 intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); //添加附件,附件为file对象 if (file.getName().endsWith(".gz")) { intent.setType("application/x-gzip"); //如果是gz使用gzip的mime } else if (file.getName().endsWith(".txt")) { intent.setType("text/plain"); //纯文本则用text/plain的mime } else { intent.setType("application/octet-stream"); //其他的均使用流当做二进制数据来发送 } startActivity(intent); //调用系统的mail客户端进行发送
Android自定义View以及layout属性全攻略 Android开发技术
对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下 CwjView myView=new CwjView(context); 如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比如 <cn.com.android123.CwjView android:layout_width="wrap_content" android:layout_height="wrap_content" /> 当然,我们也可以直接从父类声明比如 <View class="cn.com.android123.CwjView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 上面我们仅用了父类View的两个属性,均来自android命名空间,而名称为layout_width或layout_height,我们自定义的控件可能有更多的功能,比如 <cn.com.android123.CwjView android:layout_width="wrap_content" android:layout_height="wrap_content" cwj:age="22" cwj:university="sjtu" cwj:city="shanghai" /> 我们可以看到上面的三个属性,是我们自定义的。作为标准xml规范,可能还包含了类似 xmlns:android="http://schemas.android.com/apk/res/android" 这样的语句,对于定义完整的View,我们的命名空间为cwj,这里可以写为 xmlns:cwj=http://schemas.android.com/apk/res/cn.com.android123.cwjView 或 xmlns:cwj=http://schemas.android.com/apk/res/android 都可以。 对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如下 <?xml version="1.0" encoding="utf-8" ?> <resources> <declare-styleable name="CwjView"> <attr name="age" format="integer" /> […]
Android Picture和PictureDrawable的用处 Android开发技术
在Android系统中图形类为我们提供了很多图形对象类,很多网友知道Drawable,了解Bitmap之类的,那么今天的Picture和PictureDrawable又是什么东西呢? Android123再次给大家说下,Picture在android.graphics.Picture包中,相对于Drawable和Bitmap而言,Picture对象就小巧的多,它并不存储实际的像素,仅仅记录了每个绘制的过程。整个类提供了两个重载形式,其中比较特别的是Picture(Picture src) 从一个Picture对象去实例化操作, Canvas beginRecording(int width, int height) //开始记录绘制过程 static Picture createFromStream(InputStream stream) //静态方法,从输入流创建一个Pictrue对象 void draw(Canvas canvas) //在canvas上画这个picture对象 void endRecording() //结束录制绘制过程 int getHeight() int getWidth() void writeToStream(OutputStream stream) //将绘制结果写到输出流中 我们可以看到整个类中方法不多,但主要的beginRecording和endRecording记录开始和结束,最终通过draw方法绘制到画布上去,而createFromStream和writeToStream可以帮助我们从流中读写这个Picture对象,我们可以将整个绘制过程通过FileInputStream或FileOutputStream放到文件中去。 PictureDrawable是什么呢? 这里Android123提示大家它位于android.graphics.drawable.PictureDrawable 是从Drawable类继承而来的,它的构造方法只有一个就是从Picture对象中实例化,PictureDrawable(Picture picture) void draw(Canvas canvas) // 绘制到Canvas int getIntrinsicHeight() int getIntrinsicWidth() int getOpacity() //获取透明度级别 Picture getPicture() //从PictureDrawable转为Picture void setAlpha(int alpha) //设置透明级别 void setColorFilter(ColorFilter colorFilter) void setDither(boolean […]

Android AIDL全攻略一 Android开发技术
Android的服务开发中我们可能都是Activity和Service同进程处理,但想象过系统提供的各种ServiceManager吗? 比如 SensorManager、SmsManager 这些服务可以提供给任意应用,对于这样的公共后台服务器开发类似我们在Win32的COM组件或Symbian的C/S框架,我们需要AIDL(Android Interface Definition Language即Android接口定义语言)来支持服务IPC(interprocess communication IPC)和各个进程的组件进行通讯。 我们将分5节完成以下几个问题 1. AIDL的概念 (本节) 2. Service绑定 3. AIDL基础框架 4. Parcelable 5. Android开源项目中的AIDL示例分析 使用Win32+Eclipse+ADT开发的网友可以通过在SDK的platform/android-x.y/tools文件夹中找到 aidl.exe 文件,这里android123提醒大家注意的是并不是sdk根目录下的tools文件一定要进入到platform中去,其中android-x.y是相应的sdk版本。我们首先执行无参数的aidl可以看到完整的帮助如图: 当然从目前的新版ADT插件来说可以自动的通过AIDL文件生成Java代码,如果使用Ants方式编译可以考虑上面的cmd命令行方式
Android AIDL全攻略二 – Service绑定 Android开发技术
上次我们在 Android AIDL全攻略一 中讲到了AIDL的概念,由于AIDL属于服务相关内容,同时需要涉及到Service绑定问题,作为整个Android AIDL系列教程的第二节我们一起来看下Service绑定问题。我们过去使用一些轻量级的服务可能直接startService启动,通过Service中的onStart方法可以获取执行服务的命令行,其中参数Intent可以传递内容,当然作为低频度的传输也可以考虑Broadcast来交互Activity和Service,但是作为正常专业的长久的服务Android123还是推荐大家使用绑定机制来实现数据的传输。其中系统级别的跨进程服务AIDL就是基于Service绑定方式的。 作为Service必须重写一个方法就是onBind(),如果使用startService方式启动服务,则我们在onBind()中返回一个null的IBinder对象。今天使用bindService方法将如何写呢? 具体的步骤如下: 1. 使用bindService方法启动服务,bindService (Intent service, ServiceConnection conn, int flags) 有三个参数,这里大家可能会对第二个ServiceConnection和最后第三个参数的标识感到陌生,一般在我们调用bindService时需要一个ServiceConnection获取服务实例以及状态,代码如下 private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(ctx, "android123 service connected", Toast.LENGTH_LONG).show(); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(ctx, "android123 service disconnected", Toast.LENGTH_LONG).show(); } }; 这样,我们在服务的连接和断开时都会收到一个Toast的消息提示,而bindService最后的参数一般使用BIND_AUTO_CREATE 标识自动创建。所以一般我们绑定一个服务,使用下面的代码 bindService(intent, sc, Service.BIND_AUTO_CREATE); 来启动服务,而解除绑定可以用 unbindService(sc); 2. […]
Android AIDL全攻略三 – AIDL框架 Android开发技术
在Android AIDL全攻略的一和二中我们提到了相关的基础内容,本次我们将通过实例代码完成AIDL框架。这里Android123推荐大家使用Eclipse+ADT的开发方式以提高我们的效率,有关ants和aidl命令的编译方式不了解的可以来函至android123@163.com 我们会及时回复。 1. AIDL的语法和框架,Android IDL语言类似Java的接口,可以使用常规的String、Boolean等类型,但对于数值传递我们需要使用 Parcelable 接口,如果你不了解 Parcelable 的使用,Android123将在下节详细解释。 2. 在我们的工程中创建一个 xxx的.aidl文件,这时回到Eclipse重新构建工程可以发现在/res/gen的文件夹下会自动生成Ixxx.java文件,ADT帮我们实现这个接口的stub类,具体的AIDL文件内容比如为: package com.android123.cwj; interface IWeatherService { int getTemperature(in String city,out String temperature); int getTemperatureList(in String city, out String[] temperature);} 上面我们注意AIDL文件中的方法,参数类型前面有in和out关键字,类似Win32 COM中的IN或OUT,分别代表传入和输出,对于Java文件,ADT插件会在res/gen中生成一个java文件实现Stub子类。本文未完成,
Android中String资源文件的format方法 Android开发技术
很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android的资源文件values/strings.xml中如何实现格式化字符串呢? 这里Android123举个简单的例子,以及最终可能会用到哪些地方。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">cwj_Demo</string> <string name="hello">android开发网</string> </resources> 上面是一段简单的字符串资源文件,没有用到格式化,因为比较简单直接描述了意思,当我们设计一个类似 Delete xxx File ? 的时候,我们可能需要在Java中动态获取 xxx 的名称,所以定义资源时使用格式化可以轻松解决,不需要一堆String去拼接或StringBuffer一个一个append这样的愚蠢方法,看例子 <string name="alert">Delete %1$s File</string> 这里%1$s代表这是一个字符串型的,如果是整数型可以写为%1$d,类似printf这样的格式化字符串函数,当然如果包含了多个需要格式化的内容,则第二个可以写为%2$s或%2$d了,那么最终在Java中如何调用呢? 看下面的例子: 例一: 整数型的 <string name="alert">I am %1$d years old</string> 定义的是这样的 当然,我们杜绝意外情况,比如冒出个secret这样的string类型的,注意上面是%1$d不是%1$s,所以默认标准的合并成为 int nAge=23; String sAgeFormat = getResources().getString(R.string.alert); String sFinalAge = String.format(sAgeFormat, […]
Android工程内嵌资源文件的两种方法 Android开发技术
Android软件一般处理大的资源通过sdcard比如在线下载资源到sdcard,而apk中内嵌资源或二进制文件时一般使用下面的两种方法: 方法一 res/raw目录下存放,比如cwj.dat一个二进制文件,我们可以读取可以直接 InputStream is=context.getResources().openRawResource(R.raw.cwj); 方法二 工程根目录下的assets文件夹中存放,比如assets/cwj.dat 这样我们使用下面的代码 AssetManager am = context.getAssets(); InputStream is = am.open(cwj.dat); 这里Android123提示大家Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常具体数值大家可以测试下传个稍大的文件,我们在两年前的文章中有提到,而第一种raw没这个限制可以放个4MB的Mp3文件没问题。
Android中String资源文件的format方法 Android开发技术
很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android的资源文件values/strings.xml中如何实现格式化字符串呢? 这里Android123举个简单的例子,以及最终可能会用到哪些地方。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">cwj_Demo</string> <string name="hello">android开发网</string> </resources> 上面是一段简单的字符串资源文件,没有用到格式化,因为比较简单直接描述了意思,当我们设计一个类似 Delete xxx File ? 的时候,我们可能需要在Java中动态获取 xxx 的名称,所以定义资源时使用格式化可以轻松解决,不需要一堆String去拼接或StringBuffer一个一个append这样的愚蠢方法,看例子 <string name="alert">Delete %1$s File</string> 这里%1$s代表这是一个字符串型的,如果是整数型可以写为%1$d,类似printf这样的格式化字符串函数,当然如果包含了多个需要格式化的内容,则第二个可以写为%2$s或%2$d了,那么最终在Java中如何调用呢? 看下面的例子: 例一: 整数型的 <string name="alert">I am %1$d years old</string> 定义的是这样的 当然,我们杜绝意外情况,比如冒出个secret这样的string类型的,注意上面是%1$d不是%1$s,所以默认标准的合并成为 int nAge=23; String sAgeFormat = getResources().getString(R.string.alert); String sFinalAge = String.format(sAgeFormat, […]
Android多点触控开发原理 Android开发技术
Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。 首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。 下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如 event.getAction() //获取触控动作比如ACTION_DOWN event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕 event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引 event.getX(nID); //获取第nID个触控点的x位置 event.getY(nID); //获取第nID个点触控的y位置 event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的 event.getDownTime() //按下开始时间 event.getEventTime() // 事件结束时间 event.getEventTime()-event.getDownTime()); //总共按下时花费时间 有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
Android Drawable叠加处理方法 Android开发技术
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示: Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj); Drawable[] array = new Drawable[3]; array[0] = new PaintDrawable(Color.BLACK); //黑色 array[1] = new PaintDrawable(Color.WHITE); //白色 array[2] = new BitmapDrawable(bm); //位图资源 LayerDrawable ld = new LayerDrawable(array); //参数为上面的Drawable数组 ld.setLayerInset(1, 1, 1, 1, 1); //第一个参数1代表数组的第二个元素,为白色 ld.setLayerInset(2, 2, 2, 2, 2); //第一个参数2代表数组的第三个元素,为位图资源 mImageView.setImageDrawable(ld); 上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int […]
Android多人项目开发指导 Android开发技术
很多新的公司招聘了多个开发人员一起完成自己的Android项目开发,这里Android123就分工和开发模式以及部分实现细节给大家说下大概的多人开发分配。 1. 很多公司可能需要一个CAO架构出项目的各个细节用UML图表示,参照传统的开发模式可能类似于一些人写公共代码,比如I/O、相关的文件系统、数据库、网络通讯,部分完成UI相关的控件子类化和一部分的核心功能实现,这里更类似于MVC来实现所有的细节。 2. 目前就常规的中小型项目而言,使用SVN管理项目更清晰明了,公司已经假设好SVN服务器来管理整个项目的代码。 3. 模块的分工,这里我们给大家一些典型的方法,比如package名上使用类似 provider、util、data、view、model,由不同的人负责完成。 4. 项目的性能测试,对于Android开发要比iPhone麻烦的多,由于设备的性能、分辨率和固件的差异,可能导致软件运行的异常,这里我们推荐大家使用官方原版固件进行测试,第三方的固件存在很多类似“优化”这样的情况,可能对于软件的调试产生了很多的问题,同时手机尽量干净,后台不要运行太多任务,观察内存和CPU的执行,这里参考android.os.Debug和traceview的使用方法。 5. 异常处理,很多情况软件可能遇到Force Close的尴尬情况,FC和ANR的出现大大降低了用户体验,这里我们可能通过对代码更多的try和catch来防止OOM或Thread同步导致的问题。 6. 发布测试,对于软件发布时还要考虑用户体验度,删除不必要的permission,不要让用户感觉一个手电筒软件就有发送短信和拨打电话以及访问联系人的权限出现,同时尽量不要包含广告客户端,广告客户端可能是导致用户泄露隐私,影响系统运行效率,占用GPRS或3G上网流量等问题,对于靠广告作为盈利模式的软件可以目前考虑放弃或者说不适合竞争。 对于常规的中小型项目而言,遵循以上6点可以应付90%的问题,当然还有10%可能是长期的维护,分析用户的反馈和评论以及细节的调整问题,总而言之要考虑用户的感受,做软件要迎合不同年龄和人群,比如很多软件对于MM或非IT类人士可能不理解如何使用的,可以考虑推迟等等。
Android自绘GridView控件 Android开发技术
Android为我们提供了一个很好用的网格控件GridView,它的另外一种实现Google在提供PSDK时包含了一个简单的例子,大家一起来看看吧: 对于还不熟悉Android平台控件子类化的网友可以看看其具体实现的方法,主要是构造时提供了初始化资源、计算控件的尺寸和位置measure相关的处理,大家本次需要注意的是这个固定的Gird是从ViewGroup派生,没有实现onDraw,注意下面的onLayout方法,完整代码如下 public class FixedGridLayout extends ViewGroup { int mCellWidth; int mCellHeight; public FixedGridLayout(Context context) { super(context); } public FixedGridLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.FixedGridLayout); mCellWidth = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellWidth, -1); mCellHeight = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellHeight, -1); a.recycle(); } public void setCellWidth(int px) { […]
Android数组排序常见方法 Android开发技术
Android的数组排序方式基本上使用了Sun原生的Java API实现,常用的有Comparator接口实现compare方法和Comparable接口的compareTo方法,我们对于一个数组列表比如ArrayList可以通过这两个接口进行排序和比较,这里Android123给大家一个例子 private final Comparator cwjComparator = new Comparator() { private final Collator collator = Collator.getInstance(); public final int compare(Object a, Object b) { CharSequence a = ((Item) a).sName; CharSequence b = ((Item) b).sID; return collator.compare(a, b); } }; 我们的ArrayList对象名为mList,则执行排序可以调用方法 Collections.sort(mList, cwjComparator);
Android蓝牙控制之2.X或以上 Android开发技术
Android从2.0开始包含了完整的蓝牙组件,有关Android平台上的bluetooth控制常见的运行在API Level至少为5的代码如下: private BluetoothAdapter mAdapter = null; 开启蓝牙 if (!mAdapter.isEnabled()) { Intent cwj = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(cwj); } 设置可发现状态 Intent android123 = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); android123.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 500); //Android开发网提示这里为设置搜索超时500ms startActivity(android123); 本例使用的是Google推荐的通过Intent和Action方式调用系统的蓝牙宿主程序来控制蓝牙的开关,无需permission也可以很好的处理,希望未来Google应该在GPS控制上也提供类似的方法
Android Widget开发模板 Android开发技术
Android上的Widget使用了Java语言开发比W3C的Widget运行效率提高了不少,可以做更多的事情调用系统的API,除了UI上的限制外,我们可以考虑帮助系统完善一些appWidget,Android123给出大家一个开发Widget的模板。 public class cwjWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context, UpdateService.class)); //这里创建一个服务,防止出现等待超时对话框 } public static class UpdateService extends Service { //这个内部的服务我们推荐新开一个线程操作一些容易阻塞的情况,比如网络下载等等 @Override public void onStart(Intent intent, int startId) { RemoteViews updateViews = buildUpdate(this); ComponentName thisWidget = new ComponentName(this, cwjWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); […]
Android屏幕截图之View方法 Android开发技术
很多网友可能发现Android并没有提供屏幕截图ScreenShot的方法,了解Linux的网友可能知道直接读取/dev/graphics/fb0即可来实现framebuffer,当然了对于自己的View实现一些绘图或子类化的技术时可以不用系统级这样的方法,我们可以通过 view.setDrawingCacheEnabled(true); //其中View是你需要截图的的View Bitmap bm = view.getDrawingCache();

Android应用Icon大小在不同分辨率下定义 Android开发技术
对于Android平台来说,不同分辨率下Icon的大小设计有着不同的要求,对于目前主流的HDPI即WVGA级别来说,通常hdpi的应用icon大小为72×72,而标准的mdpi即hvga为48×48,对于目前HTC和Motorola推出的一些QVGA的使用了ldpi,图标为32×32,常见的Android图标大小设计规范如下表所示: Launcher 36 x 36 px 48 x 48 px 72 x 72 px Menu 36 x 36 px 48 x 48 px 72 x 72 px Status Bar 24 x 24 px 32 x 32 px 48 x 48 px Tab 24 x 24 px 32 x 32 px 48 x 48 px […]

