对于开发者选择Windows Phone和Android呢? 下面就Android123的对实战开发不同做简单对比: 一、用户界面 Windows Phone的用户界面Metro UI我们算作色块好了,桌面主题无法定制,即使是每个厂商的主题,必须单独运行一个程序,比如HTC Hub。相对于Android来说桌面整个就可以被替换掉,这里分为三部分吧:1. 整个桌面主题 2.顶部滑动的状态栏 3. 桌面appWidget小插件。 Android用户可以放置天气预报、微博、开关WiFi小插件到桌面上,而WP7每次都要进入相应的程序,或进入到系统设置中才能开关WiFi十分繁琐。整体流畅性,Android设备硬件配置达到了512MB RAM和或者说同等级的WP7来说,体验上没有任何问题。市面上很多低端山寨Android设备严重影响了体验度,尤其是小RAM和ARM11的这种廉价硬件,要知道WP7最低配置就是1GHz的A8处理器。 二、电话短信 电话短信在界面上 Android和Windows Phone 7使用了会话方式,当然这些从iOS时代就开始了,要说模仿可能是抄袭Apple的,对于开发者角度来说,你可以在Android平台做出 归属地显示、来电防火墙,短信防火墙,而WP7那SDK发短信都要调用系统界面,所以这方面WP7上目前无法开发出相应的通话管理软件,如果你是商务人士可能会比较郁闷吧。 三、文件管理 WP7和iPhone一样,文件传输都需要借助PC上的专用软件,WP7需要Zune的支持,而iPhone则需要iTunes,它们能传输的只有 照片、音乐、应用、视频和电子书,安装软件除了手机内置的应用商店外,只有PC上的官方工具如Zune,否则还要考虑破解越狱。WP7越狱后能做的也只有安装软件了,并不开放API,这点和Android有本质的区别,在Android上你可以使用APK安装器装软件,无论是PC还是手机上。任何一部Android手机都支持U盘模式,可以方便的当做U盘来说用,而WP7默认插入电脑是没有反应的,还需要自己去DIY。 四、开发支持 WP7的开发工具为VS2010+Dot Net Framework 4.0,但是比较限制的是必须Vista或Win7才能开发,虽然XP下能破解安装SDK,但那只能是帮助手机越狱,而开发上还是需要回到Vista或Win7,这点Android上支持Windows、Mac OS和Linux,更可笑的是,微软没有开发注册账户,真机还无法部署软件,同时无法对真机截图,不知道微软怎么想的,还必须要上模拟器吗? 虽然Android的Eclipse开发环境安装麻烦些,但是没有这些可笑的限制,至少给了我们希望,而微软一竿子打死。
图160S
Android SDK目录结构和工具介绍 Android开发技术
Android SDK目录下有很多文件夹,主要都是干什么的呢? 1. add-ons 这里面保存着附加库,比如Google Maps,当然你如果安装了Ophone SDK,这里也会有一些类库在里面。 2. docs 这里面是Android SDK API参考文档,所有的API都可以在这里查到。 3. market_licensing 作为Android Market版权保护组件,一般发布付费应用到电子市场可以用它来反盗版。 4. platforms 是每个平台的SDK真正的文件,里面会根据API Level划分的SDK版本, 这里就以Android 2.2来说,进入后有一个android-8的文件夹,android-8进入后是Android 2.2 SDK的主要文件,其中ant为ant编译脚本,data保存着一些系统资源,images是模拟器映像文件,skins则是Android模拟器的皮肤,templates是工程创建的默认模板,android.jar则是该版本的主要framework文件,tools目录里面包含了重要的编译工具,比如aapt、aidl、逆向调试工具dexdump和编译脚本dx。 5. platform-tools 保存着一些通用工具,比如adb、和aapt、aidl、dx等文件,Android123提示,这里和platforms目录中tools文件夹有些重复,主要是从android 2.3开始这些工具被划分为通用了。 6. samples 是Android SDK自带的默认示例工程,里面的apidemos强烈推荐初学者运行学习,对于SQLite数据库操作可以查看NotePad这个例子,对于游戏开发Snake、LunarLander都是不错的例子,对于Android主题开发Home则是android m5时代的主题设计原理。 7. tools 作为SDK根目录下的tools文件夹,这里包含了重要的工具,比如ddms用于启动Android调试工具,比如logcat、屏幕截图和文件管理器,而draw9patch则是绘制android平台的可缩放png图片的工具,sqlite3可以在PC上操作SQLite数据库,而monkeyrunner则是一个不错的压力测试应用,模拟用户随机按键,mksdcard则是模拟器SD映像的创建工具,emulator是android模拟器主程序,不过从android 1.5开始,需要输入合适的参数才能启动模拟器,traceview作为android平台上重要的调试工具。 8. usb_driver 顾名思义,保存着android平台google官方机型的驱动如nexus one、nexus s,同时也有一些老机型驱动的支持,比如说htc dream、htc magic和motorola的droid。
强制保持Android Activity状态 Android开发技术
有的时候我们的Android在应用运行时,可能需要临时退出,比如突然接到来电,但是切换回来界面时,可能Activity又重新从第一个界面开始显示,并不是刚才用户操作的界面,这里可以通过在androidmanifest.xml中在需要保留的activity中添加android:alwaysRetainTaskStat="true" 这句即可,这里Android123还要提醒大家的是有时候你的应用可能会产生多个实例,你还可以在主Activity中加入android:launchMode="singleInstance" 来强制让系统仅运行一个实例。
Activity状态保存增强版 Android开发技术
对于Activity状态保存上一次在 强制保持Android Activity状态 一文中我们做了讲解,但是还有一种更坏的情况,比如你接的来电时间比较长,由于用户的Android设备RAM较少,你的应用被Java VM的GC给回收了,下次用户再切换回,由于你的应用已经被系统结束了任务,对于游戏来说这可能是致命的。 所以通过重写Activity的onSaveInstanceState(Bundle outState) 方法可以在Android系统触发结束任务时,保存当前Activity的值,而下次进入该Activity时,可以通过重写 onRestoreInstanceState(Bundle savedInstanceState) 来恢复数据,参数Bundle支持常见的String、Integer、Double、以及字节数组,具体的使用实例可以参考 Android开发网早期文章 onSaveInstanceState和onRestoreInstanceState的用处
在Activity之间传递复杂类型 Android开发技术
很多Android开发者对于Activity中如何传递复杂的类型不是很清楚,这里Android123再帮刚入门的开发者整理下。对于传递 一、实现Parcelable接口 对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的,对于二进制数据,传递的参数为putExtra(String name, Parcelable value) ,比如Bitmap类就实现了Parcelable接口,如果需要在Activity中传递图片,可以直接用Bitmap类型,当然如果本身是Drawable你可以先转化为Bitmap,可以参考 Bitmap和Drawable相互转换方法 一文。 相关的Intent方法还有 putExtra(String name, Parcelable[] value) // 传递一个Parcelable数组putExtra(String name, Bundle value) //传递一个Bundle对象 putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value) //传递一个实现Parcelable接口的对象数组putStringArrayListExtra(String name, ArrayList<String> value) //传递一个字符串数组putIntegerArrayListExtra(String name, ArrayList<Integer> value) //传递一个整形数组。 这里Android开发网提示大家,Integer这些装箱类型,Intent还实现了 putExtra(String name, int[] value) 这样的基础类型数组,同时Parcelable效率比标准的Java序列化更高,同时还被用作在AIDL中交换数据,所以掌握Parcelable这样的显示序列化技术,可以大幅提高数据交换性能。 二、使用全局单例模式 由于Android中Activity传递主要靠Intent这个类,Intent类内部传递数据的效率仍然需要拷贝,如果数据量很大,还可以考虑使用Singleton Pattern单例模式定义一个全局的静态类,这样传递的效率最高,大家可以看下Java设计模式,了解其中的妙用。 三、实现Serializable接口 如果你学习过传统的Java,则可以通过串行化技术,实现Serializable接口,其实这个原理和Parcelable差不多,均将自己的类转换为基本的类型比如说字节数组。在Android中不是很实用,这里不再赘述,在Intent中使用Intent putExtra(String name, […]
预防Android内存泄露 Android开发技术
对于很多处理图形相关的Android开发者来说,大的Bitmap对象可能直接导致软件崩溃,Android平台如何防止内存泄露呢? 目前来说Android设备的RAM可能差距比较大,很多低端配置的256MB RAM或512MB RAM由于运行了太多的后台任务或HTC Sense这样的主题导致了处理一些高像素的图片,比如500w或800w像素的照片很容易崩溃。 1. 判断目标设备Dalvik VM内存情况 通过 java.lang.Runtime类的 long freeMemory() 方法可以获取当前进程的RAM可用情况,Runtime类需要 getRuntime() 方法来实例化。 比如获取最大可用RAM 为 Runtime.getRuntime().maxMemory(); 2. Bitmap对象在打开时可以考虑先缩小图片 通过减少工作区域可以有效的降低RAM使用,由于在内存中是DIB方式,可以想象ARGB的图像占用内存为 4*height*width,比如500万像素的图片,占用内存就是500×4=2000万字节就是19MB左右。同时Java VM的异常处理机制和绘图方法可能在内部产生副本,最终消耗的运行内存是十分庞大的,对于图片打开时就进行缩小可以使用 android.graphics.BitmapFactory的相关方法来处理,这里参考Android123早期文章,Android缩略图类源代码 即可 3. 及时的显示执行Bitmap的recycle方法,以及是当时可以调用Runtime的gc方法,提示虚拟机尽快释放掉内存
setpref轻松修改preferences文件 Android开发技术
有时候我们使用adb shell想更改一些应用的配置信息,Android上每个应用android.content.SharedPreferences类保存的位置对应apk安装后的/data/data/<package name>/shared_prefs 目录中,由于使用了key-value的pair方式存储,这里android使用的是xml文件,在linux shell下编辑不是很方便,不过通过 setpref 命令可以很轻松的修改。 1. 首先chmod 777 设置文件有写权限。 2. 为了防止共享违例,可以先killall <package name> 来结束掉任务。 3. 比如说设置 paid为true,则在/data/data/com.android123.test/shared_prefs目录中执行"setpref cwj boolean paid true 这句的意思是,设置cwj这个xml文件的paid属性值为true。 当然以上所有步骤额执行都需要root权限,一堆对于开发调试帮助比较大。
Android语音便签快速调用-内置录音程序 Android开发技术
对于Android来说,官方提供了一个简单的录音程序,可以很方便的实现一个语音便签功能,大约95%的Android设备均自带了官方的这个录音应用,调用方法为 1. 首先在Activity中定义一个Activity返回结果句柄 private static final int CWJ_RECORD = 1987; 2. 接下来只需要执行Media.RECORD_SOUND_ACTION这个Action即可启动Android内置的录音程序。 Intent intent = new Intent(Media.RECORD_SOUND_ACTION); startActivityForResult(intent, CWJ_RECORD); // Android123提示大家,这里使用startActivityForResult获取结果,不能简单的startActivity,否则无法获取保存录音文件的位置。 3. 最后处理 Activity的 onActivityResult 方法,代码为 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case CWJ_RECORD: String dataUri=getIntent().getDataString(); String dataFile=data.getDataString() ; […]
PhoneGap让你的应用兼容Android、iOS、WP7 Android开发技术
PhoneGap是一个开源项目,使用PhoneGap通过编写HTML5、CSS和JavaScript让你的应用很容易的在不修改代码情况下运行在谷歌Android、iOS苹果和微软Windows Phone 7、诺基亚Symbian等系统上,看起来有些像J2ME当初的一次编译,各处执行的设计方式,没错由于HTML5层面比Java还高,所以PhoneGap就是一个中间件,在各个平台上解析你的HTML代码来执行相应的功能。 今天Android123介绍的不是PhoneGap而是它本身就是开源的,由于为了兼容各个平台,比如Bada、Qt可以让很多移动开发者快速通过学习PhoneGap的代码来了解各个平台的移动应用开发。它的源码托管在GitHub,可以在https://github.com/phonegap 中找到。
APK安装失败返回值 Android开发技术
对于Android平台的APK文件安装来说,如果安装失败后,则系统会返回一些错误,下面是Android最新版的APK安装返回值,adb install的返回值可能和这个部分有出入,具体可以参考base下cmds的pm相关的执行脚本,分析,下面是目前最新的返回结果,由于Google将PackageManager的installPackage方法移除,下面的返回值也从最新的SDK文档中移除,作为结果参考方便大家查阅Android123整理如下: int FORWARD_LOCK_PACKAGE int INSTALL_FAILED_ALREADY_EXISTS int INSTALL_FAILED_CONFLICTING_PROVIDER int INSTALL_FAILED_DEXOPT int INSTALL_FAILED_DUPLICATE_PACKAGE int INSTALL_FAILED_INSUFFICIENT_STORAGE int INSTALL_FAILED_INVALID_APK int INSTALL_FAILED_INVALID_URI int INSTALL_FAILED_MISSING_SHARED_LIBRARY int INSTALL_FAILED_NO_SHARED_USER int INSTALL_FAILED_OLDER_SDK int INSTALL_FAILED_REPLACE_COULDNT_DELETE int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE int INSTALL_FAILED_UPDATE_INCOMPATIBLE int INSTALL_PARSE_FAILED_BAD_MANIFEST int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES int INSTALL_PARSE_FAILED_MANIFEST_EMPTY int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED int INSTALL_PARSE_FAILED_NOT_APK int INSTALL_PARSE_FAILED_NO_CERTIFICATES int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION int INSTALL_SUCCEEDED int REPLACE_EXISTING_PACKAGE

WordPress 相关日志插件:WordPress Related Posts
我们知道 WordPress 使用的 MySQL 数据库默认是不支持中文分词,所以在中文情况下产生相关日志的最好方法就是通过 Tag,而 WordPress 2.3 版本开始 WordPress 内置了 Tag 的支持。 所以根据日志含有相同的 Tag 数越多,就认为日志相关性越强,所以我根据这一原理开发了 WordPress Related Posts 这个插件,最新版已经由 Zemanta 接手继续开发了。 WordPress 相关日志的详细功能 WordPress 相关日志插件最基本的功能就是根据日志的 tag 的相关性产生一个相关日志列表,并且可以把相关日志列表添加到 Feed 中。 支持生成缩略图和主题,让你的相关日志更加吸引人。 支持响应似设计,在移动端表现完美。 支持统计,了解相关日志对整个网站的提升效果。 安装和使用 WordPress 相关日志 上传整个插件文件夹到 /wp-content/plugins/ 目录下或者在后台直接安装 在插件菜单下激活插件 在模板文件中适当的位置插入 <?php wp_related_posts(); ?> 模板函数或者在后台使用自动插入相关日志功能 在后台管理界面下,直接进入 Related Posts 中配置插件的输出 WordPress 相关日志的详细配置 WordPress 相关日志插件设置比较复杂,分成以下几块: 基本设置 WordPress […]
WordPress 技巧:把自定义日志类型添加到 Feed
如果你的 WordPress 和我一样使用了自定义日志类型(Custom Post Type),并且想把这个自定义日志类型的文章显示到 Feed 中,那么你需要在 functions.php 中加入下的代码: add_filter(‘pre_get_posts’, ‘add_microblog_2_feed’ ); function add_microblog_2_feed( $query ) { if ( is_feed()){ $query->set(‘post_type’, array( ‘post’, ‘m’)); } return $query; } 其中这里的 m 是我爱水煮鱼微博的 Custom Post Type 的名称,如果你想吧 page 更新也放到 feed 中去,可以把上面改成 array( ‘post’, ‘page’)。 标签:WordPress 技巧
使用 phpMyAdmin 管理 WordPress 数据库
phpMyAdmin 是开源的 MySQL 数据库管理工具,它能够让用户直接对 MySQL 数据库进行操作的 PHP 脚本程序。 什么是 phpMyAdmin? phpMyAdmin 是用来对数据库进行各种操作的维护数据表,备份信息,和在 WordPress 不工作的情况下直接编辑数据库。 其实 phpMyAdmin 最大的好处就是可以直接用来进行 SQL 查询,这比直接使用 MySQL 的命令行方便了很多。 一般在主机的控制面板,如 cPanel 和 Plesk 中,都已经预装了 phpMyAdmin。如果你使用这些主机控制面板,无需做任何事情的时候,只需在控制面板中找到相应的链接即可使用 phpMyAdmin。当然也可以也可以直接到 phpMyAdmin 项目页面下载和安装即可。 在 WordPress 后台使用 phpMyAdmin WordPress 也是使用 MySQL 作为数据库构建的,它把所有信息都保存在 MySQL 数据库中的,所以我们可以通过 phpMyAdmin 来查看 WordPress 的数据库中数据,字段和表。如果为了方便,也可以使用 WP-phpMyAdmin 这个插件可以整合 phpMyAdmin 到 WordPress 后台。 WP-phpMyAdmin 这个插件使用非常简单,只需要下载安装激活即可,然后到 WordPress 后台 > […]
WordPress 数据库管理和优化插件
我们都知道 WordPress 使用的数据库是 MySQL 这个世界上使用最广的开源数据库(当然也可以简单的 hack 换成其他数据库),WordPress 把所有的信息,如日志,留言,当前主题,使用的插件等等,都放在 MySQL 数据库中,所以对 WordPress 的数据库的管理是每个使用 WordPress 写博客的 blogger 日常非常重要的一项工作,而众多的 WordPress 数据库管理,备份,优化插件给这项管理工作提供了非常大的方便,下面我就讲讲我在 WordPress 数据库管理过程中主要使用到几款 WordPress 插件,希望对大家在对 WordPress 数据库进行管理的过程中有所帮助。 1. 数据库备份:WP Database Backup 数据库备份无疑是数据库管理中最重要的一项工作,如果服务器因为某种原因宕掉了,又或者网站被黑,内容被篡改,而又没有备份数据库,这时候就彻底悲剧了,很多很多重要数据就会丢失且无法恢复。 而在 WordPress 数据库备份这方面,WP Database Backup 无可争议是最好的 WordPress 数据库备份插件,它可以支持你把数据库备份到服务器上,下载到本地,或者发动到你的邮箱,并且更重要的是你还可以让它定期把数据库备份好,自动发送到你的邮箱中。 更加详细关于 WordPress 数据库和整个博客的备份的介绍,请参考:如何有规律的备份 WordPress 博客 2. 数据库管理:WP-phpMyAdmin phpMyAdmin 是开源的 MySQL 数据库管理工具,它能够让用户直接对 MySQL 数据库进行操作的 PHP 脚本程序。phpMyAdmin 能够进行 SQL 查询,这个在插件开发的时候特别有用(当然是要在测试的数据库上使用),另外对数据库的日常管理,如优化,修复,备份数据库,查看数据库存在的错误,创建索引等等。 […]
WordPress 技巧:自定义登录界面的 Logo
如果想自定义 WordPress 登录界面的 Logo,可以在当前的 functions.php 文件中添加如下函数,或者单独保存为一个插件并上传激活。并且把自定义的 Logo 命名为 custom-login-logo.gif,并且放到当前主题目录的 images 文件夹下。 <?php /* Plugin Name: 自定义登录界面的 Logo Plugin URI: http://blog.wpjam.com/m/custom-login-logo/ Description: 自定义 WordPress 登录界面的 Logo Version: 0.1 Author: Denis Author URI: http://blog.wpjam.com/ */ add_action('login_head', 'wpjam_custom_login_logo'); function wpjam_custom_login_logo() { ?> <style type="text/css"> h1 a { background-image:url(<?php echo get_bloginfo('template_directory'); ?>/images/custom-login-logo.gif) !important; } </style> <?php } ?> […]
PhoneGap for Android平台源码示例 Android开发技术
前一段,Android123介绍了PhoneGap开源项目用于多平台的学习在《PhoneGap让你的应用兼容Android、iOS、WP7 》一文中讲到了,今天一起来看下PhoneGap for Android平台的代码吧,完整源码打包放到了Android开发论坛上,点击进入下载页面 对于初入Android开发的网友可以很好的了解代码规范,同时很多成熟的可复用代码希望对大家有帮助。PhoneGap内部数据传递使用了JSON,比如PhoneGap中指南针部分源码如下: public class CompassListener extends Plugin implements SensorEventListener { public static int STOPPED = 0; public static int STARTING = 1; public static int RUNNING = 2; public static int ERROR_FAILED_TO_START = 3; public long TIMEOUT = 30000; // Timeout in msec to shut off listener int status; // status of listener float […]
Android框架层开发从入门到精通 Android开发技术
对于Android框架层(Framework) 仍然有很多开发者不是很理解,Android123用三周时间总结 《Android框架层开发从入门到精通》准备出版,考虑到时间,将免费在Android123开发站点上连载分享。 前置知识 一、Java虚拟机 二、Binder 三、JNI和C++ Android Framework开发 四、GIT源码管理 五、RILD 六、图形和音频 七、编译自己的ROM
ProtoBuf协议轻松交换你的Android数据 Android开发技术
很多网友想了解Android PC同步软件技术,其中主要的数据交换可以使用Google官方的ProtoBuf开源项目来解决,ProtoBuf是Protocol buffer的缩写,主要是文件流编码基于Java、C#、C++可以很好的让你的Android应用和Web Services以及PC客户端进行数据同步、交换。Android开发网很早就评估了这种方法,对于云支持、和比较好的扩展有着高效开发的优点,如果你们公司的程序员技术不是很高或者对数据传输不是很了解可以试试Google ProtoBuf协议。 对于ProtoBuf源代码和官方的技术支持可以访问 http://code.google.com/p/protobuf/
Android 4.0和WP7.5开发技术对比 Android开发技术
对于谷歌Android 4.0 Ice Cream SandWich和微软WP7.5 Mango在开发技术上作对比,可以看出早期Google学习了Microsoft的WPF的设计方式,由于微软Windows Phone 7发布缓慢,导致Google在技术上将微软复杂的设计方式改进,从现在来看安卓冰激凌三明治和微软WP7芒果来看开发技术上仍然存在着巨大的差异。对于准备步入移动开发的网友,就目前主流的系统做简单的分析: 一、UI控件和设计模式 对于WP7来说,整体控件数量不如Android丰富和实用,但也有一些创新的地方,比如说枢轴Piovt控件,在触控操作上比Android的TabHost强了很多,但没有提供类似GridView这样的控件在Siliverlight中,由于WP7的UI刷新机制基于MVVM模式,相对于Android的MVC有些不同,需要继承INotifyPropertyChanged接口,通过数据绑定来更新UI控件的值,相对比较繁琐。在控件自定义方面,WP7可以使用银光的UserControl或从任何已有的控件中直接派生,对于Android来说这点基本相同,但提供的方法比如触控、长按相关的微软这点都要 依赖Toolkit来实现,整体相对繁琐很多。 二、数据库层 微软在数据库方面一直有MS SQL,在手机上有SQL CE这样的轻量级数据库,但操作处理方面同样需要实现 INotifyPropertyChanged接口进行更新,修改表,似乎变得更加抽象。同时数据交换方面微软还有LINQ,在Web Services方面几乎和J2EE差不多,但相对于手机上而言Android的SQLite似乎更好用明了,这点微软确实输了。 三、系统执行模型 在WP7.5 Mango上支持了多任务,内存管理几乎和Android一模一样,同时新增了类似iOS上的数据推送,需要微软服务器中转的Push Notification,由于考虑应用随时被系统内存回收,必须保存每个页面的数据到持久化的存储中,比如类似Android的SharedPreferences而在WP中为银光的IsolatedStorageSettings,在很多地方微软都在学习着谷歌,相比WP7到WM6的改进来看。 四、图形系统 这点WP7和Android有着天壤之别,Windows CE下3D为DirectX,2D为GDI方式渲染,而Android下为OpenGL,同时WP7无法使用本地语言开发,导致iPhone和Android程序员在3D方面很是陌生。 五、文件系统 在WP7芒果上,微软学习了iOS那样的封闭,每个应用完全独立,所以没有文件管理器这个概念,导致了Adobe Reader这样的应用必须将pdf放入邮箱中,通过邮件附件来打开阅读。同样每个Windows Phone 7芒果手机一般不会有microSD卡,而是机身至少内置8GB或16GB的存储空间,同样无法用U盘功能,每个应用相对隔离,运行在自己的沙盒空间里,对于应用可靠性和安全有了保障,但是对于部分实现方面确实不够好用。 六、运行流畅度 如果你看见WP7手机运行很流畅,那么你可能真的错了,在本质上Java虚拟机和微软的.Net Framework运行时库的底层效率差不多,但Android的手机一般运行着更复杂的桌面,比如左右N个主屏和一堆appWidget小插件,而微软似乎Windows Phone 7的应用一般限制在5个同时工作的,否则将会被结束任务,同时由于部分低价Android设备,导致整体硬件配置偏低,比如有ARM11的CPU,RAM只有256MB的情况,而微软WP7第一代手机至少配备了A8 1GHz的处理器,512MB的RAM,第二代的WP7 Mango手机配备了1.4GHz新一代高通Snapdragon,比如8X55系列,所以很多地方了看WP7更流畅,但其实从单个应用来看,WP7应用的启动速度远不如Android平台上的应用,所以微软甚至设计出了SplashScreenImage.jpg这样的图片为每个默认工程提供一个载入图片。如果是微软系统自带的应用由于可以调用本地的方法相对于第三方的Windows Phone应用来说启动会快很多。 最终结论是Android123仍然推荐大家在高效和开放的Google提供的平台开发,至少不会束缚你的想象力和实现速度,微软设计了很多限制和门槛,同时不开源在分析和实现上都会产生很多问题,至少Android的SDK可以工作在Mac OS、Windows各个平台和Linux上,而微软似乎将WP7 SDK锁定在Vista和Win7上。
Android Rootkit开发技术要点 (一) Android开发技术
对于Android平台的安全问题凸显,Android123经过长期的分析研究就目前Android平台上Rootkit开发实现底层防火墙相关基础做简单的总结,Android的Rootkit和PC上的Linux Rootkit没有太大的区别,如果你有Linux内核相关知识或Win32下内核驱动开发知识阅读本文会轻松很多。 和Windows一样Android的Rootkit离不开底层的调用,在Win32上我们使用较低层的API有Native API,一般以Ring0中以Zw开头的函数居多,在Ring3中则为Nt开头的函数,比如任务管理器常用的NtQuerySystemInformation函数,它们的特点就是调用系统底层服务,我们叫做系统服务描述表SSDT,当然类似的还有系统服务中断向量表IDT。在Linux中我们获取本机API需要使用LKM加载内核模块,通过Hook技术可以轻松的替换原有API的入口点实现隐藏进程、端口,对于底层的系统服务来说,在Linux中使用系统服务调用表(Sys Call Table)中的函数来执行相关操作。Android从早期版本就是用了Linux 2.6以上的内核版本,获取sys call table偏移地址和我们早期在PC Redhat获取技术上有很大不同,挂上gdb慢慢分析吧,目前业界公认的方法就是通过swi中断来动态搜索系统调用表,这里我们直接给出代码 include <linux/kernel.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/init_task.h>#include <linux/syscalls.h> unsigned long* find_sys_call_table(); int init_module() { printk("<1> Hello, kernel!\n"); unsigned long *sys_call_table = find_sys_call_table(); return 0;}void cleanup_module() { printk("<1>I’m not offended that you" "unloaded me. Have a pleasant day!\n");} unsigned long* find_sys_call_table(){ //Address of the sofware interrupt (swi) handler in high […]
Android 4.0新增WiFiDirect功能 Android开发技术
Android 4.0引入了一项很重要的技术就是 WiFiDirect (WiFi直连) ,它可以让WiFi设备无需热点即可实现两个WiFi设备的P2P数据交换。使用最新的Android 4.0 SDK,最低API Level 14才支持此项技术,在SDK的例子中我们可以看到很多界面用到了Android 3.0时代的Fragment容器。 首先我们需要实现android.net.wifi.p2p.WifiP2pManager.ChannelListener 接口来获取支持WiFi直连的Android设备。 public class WiFiDirectActivity extends Activity implements ChannelListener, DeviceActionListener { public static final String TAG = "wifidirectdemo"; private WifiP2pManager manager; private boolean isWifiP2pEnabled = false; private boolean retryChannel = false; private final IntentFilter intentFilter = new IntentFilter(); private Channel […]
Android NFC开发实战 Android开发技术
对于Android 4.0 SDK中提供的Beam例子,对于NFC开发来说的确是一个不错的模板。对于了解NFC的NDEF消息处理过程不妨看下面的代码。 public class Beam extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; TextView mInfoText; private static final int MESSAGE_SENT = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mInfoText = (TextView) findViewById(R.id.textView); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); //实例化NFC设备 if (mNfcAdapter == null) { mInfoText = (TextView) findViewById(R.id.textView); mInfoText.setText("NFC is not available […]
Android程序运行性能优化 Android开发技术
对于Android手机来说,由于Google全面开放多任务同时运行着Java这样的解释型语言导致对RAM的开销很大,随着Android平台的发展很多新手程序员在经验等问题,会导致你的应用执行效率较低。针对于发布版应用应该注意以下几点: 一、慎用Logcat输出 如果你的应用总是在后台不断的输出Log.i或Log.d的内容,除了增加系统开销外,对你应用的整体效率受影响,尤其是持续输出很多内容。由于Log需要底层的JNI调用,对Java虚拟机的开销来说还是不小的。 二、ProGuard扰码器 对于Android应用加密,扰码器可能除了修改类和变量的名称外,增加算法复杂难度,可能出现本身1+1=2的问题变为了2*10-10-8这样的情况,当然Android123是举个例子来说明扰码器的工作原理,这对于程序的运行效率和部分逻辑可能会改变,所以这点要权衡配置扰码器是否仅修改变量名称。 三、基础知识 1. 访问变量比访问一个类的字段要快/ 2. 同时判断数组为空一般不用getCount()==0这样的方法,直接通过isEmpty()这样的方法来处理 3. 很多情况下慎用全局的静态类。 4. Android应用执行起来很多的CPU占用都是出在JVM资源是放上,所以如果尽可能的减少内存的释放,或增加手机的RAM对程序的执行效率会很有帮助。 5. 尽量少的注册系统广播通知接收,同时适当的可以通过重写onPause或onResume来控制Activity显示时才获取部分系统广播。
NDK版本与Android固件要求对应表 Android开发技术
对于Android NDK版本来说,编译出来的so文件对应运行的Android固件最小版本是有一定要求的,高版本的NDK编译出的.so文件由于包含了一些新的特性,新特性可能在低版本的Android固件上无法运行,目前最新的对着表Android开发网总结如下 API Level 1 — Android 1.0 不支持NDKAPI Level 2 — Android 1.1 不支持NDKAPI Level 3 — Android 1.5 NDK 1API Level 4 — Android 1.6 NDK 2API Level 5 — Android 2.0 API Level 6 — Android 2.0.1 API Level 7 — Android 2.1 NDK 3 API Level 8 — Android 2.2 […]
Android标题栏进度指示器使用方法 Android开发技术
很多网友可能发现,比如Android自带的浏览器在载入网页时等待时间可能会在标题栏的右上角有一个小圆圈在不断旋转,由于其不包含具体进度,很多网友可能没有找到详细的操作方法在SDK中。作为标题栏进度指示器其实属于Activity类的方法。 在使用时我们首先需要在setContentView之前声明 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); ,在需要显示进度时调用 setProgressBarIndeterminateVisibility(true);即可,停止时调用 setProgressBarIndeterminateVisibility(false);
优化Dalvik虚拟机的堆内存分配 Android开发技术
对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
Android中的正则表达式Regex使用 Android开发技术
对于数据的提取查找,我们推荐大家使用功能强大的正则表达式,在Android平台中可以方便的使用Java VM中自带的Regex正则表达式库,实际测试性能比STL和Boost的差不了多少,当然了Android上的正则库是NDK编写的底层。 这里我们就拿常用的电话号码匹配来做个例子,大家都知道国外的号码中间有几个横杠,这里我们就用国内的区号来测试吧。 String phoneArray = "cwj 的号码:021-12345\n" + "smart 的号码:021-88888\n"+ "李雷 的号码:010-99999\n" + "韩美美 的号码:021-66666\n"; 如果我们需要匹配以021开头的正则表达式为 .*021-\\d{5} ,我们使用Java的Pattern类编译封装,使用matcher来查找,其中group方法就是结果,当然group(0)是找的自己串,同时可能有多个结果,注意数组下溢问题。 Pattern pattern = Pattern.compile(".*021-\\d{5}"); Matcher matcher = pattern.matcher(phones1); while(matcher.find()) { String s= matcher.group() ; Log.e(s,"android123.com.cn"); // 使用Android的Logcat查看运行结果,直接使用e标志红色的为结果。 } 正则表达式相对强大,如果过去做过Web开发的你,对于用户输入的过滤可能相当的熟悉。具体的正则式编写可以查看网上的相关内容。
InputSream输入流转String字符串,Android开发工具类 Android开发技术
在Android平台上使用Java层处理I/O时主要使用流,这里Android开发网给大家一个方便的类,可以处理InputStream输入流转为String字符串,在效率上,我们使用了字符串拼接StringBuilder类减少内存碎片以及BefferedReader类实现一个缓存。 private String Stream2String(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is), 16*1024); //强制缓存大小为16KB,一般Java类默认为8KB StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { //处理换行符 sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch […]
Use Sinaapp Lib:使用新浪云计算 CDN 给 jQuery 加速
我前面介绍过 Google Hosted Libraries:它把一些常用的的 JavaScript 库放到 Google 的服务器上,这样就可以充分利用 Google 的服务器资源,节省自己的网络带宽。其实国内新浪云计算平台 Sinaapp 也提供了这些库:http://lib.sinaapp.com/。 为了方便 WordPress 博客使用,我就开发了对应的 WordPress 插件:Use Sinaapp Lib,把 WordPress 中的 JavaScript 库用 Sinaapp Lib 来替代,达到节省带宽和加速的目的。目前这个插件支持以下的库: jquery jquery-ui backbone underscore json2 swfobject 另外需要特别注意的是,这个插件使用的 jQuery 库是最新的 1.9 版本,会有一些兼容性的问题。 插件使用非常简单,只需要上传激活即可,原来使用 wp_enqueue_scripts 方式调用 jQuery 的插件无需做任何更改即可继续使用。 下载:use-sinaapp-lib.zip 标签:CDN WordPress 插件
WPJAM 问答:新的 WordPress 问答网站
经常有人在博客上给我留言问我问题,或者直接加我 QQ 问我问题,基本上都是 WordPress 相关的问题,但是实在时间和精力有限,我们没办法全部回答,并且博客上的留言散落在各篇文章,QQ上回答了,其他有同样问题的用户也看不到,所以我决定做一个 WordPress 相关的问答网站,因为前段时间把博客迁移到 wpjam.com 平台上,所以我决定这个问答系统就叫做 WPJAM 问答。 WPJAM 问答系统链接是:http://bbs.wpjam.com/,虽然使用的二级域名中带有 bbs,但是其实还是使用 WordPress 构建的,但是我做了以下几方面的优化: 首先,这个系统无需用户登陆,但是又不想让用户手工输入自己的个人信息,所以我使用了多说的一些 JavaScript 接口,就是如果用户已经登录了多说这个社会化留言系统,WPJAM 问答系统就会默认自动获取你在多说中的信息,并直接和问题的标题和内容一起提交。如果没有登陆多说,那你也只能自己输入名字和邮箱,以便以后通过邮件获取问题的答案了。 然后,为了让用户尽快收到答案,在有人回答了用户的问题之后,系统会自动发一封邮件告诉用户,你的问题已经有人回答了,但是为了防止骚扰,只有第一次回复的时候才会发邮件,因为如果还没有解决用户的问题,用户可以通过多说继续留言和收到回复。 我们知道这样的面对用户的问答系统 HTML 标签是允许很少的,WPJAM问答系统更是所有的 HTML 标签都不支持,但是因为主要面对 WordPress 的问题,所以一定是要允许输入代码的,这个时候怎么办?只需要把代码放到 [code] 和 [/code] 中,就能正确把代码贴入,并且无需当心代码被过滤掉。如果代码还不能描述清楚你的问题,还可以在 [img] 和 [/img] 中贴上截图的链接来进一步描述问题。 <!– 集成在 WordPress 后台,这个是我认为这个问答系统最好的地方,我已经制作了一个 WordPress 插件(还在最后测试,很快发布),让你直接在 WordPress 后台直接提问和收到回复。 –> 不过为了防止垃圾留言,第一提问是需要审核的,之后就不需要了,并且不要发布的太多太快,好吧,你如果有什么 WordPress 问题没办法解决,就来提问吧:http://bbs.wpjam.com/。


