任何问题请联系WX:uu16853

买模板送网站采集器 让你轻松放开双手运营网站!

购买更多有优惠!

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显示时才获取部分系统广播。

Android标题栏进度指示器使用方法 Android开发技术

  很多网友可能发现,比如Android自带的浏览器在载入网页时等待时间可能会在标题栏的右上角有一个小圆圈在不断旋转,由于其不包含具体进度,很多网友可能没有找到详细的操作方法在SDK中。作为标题栏进度指示器其实属于Activity类的方法。   在使用时我们首先需要在setContentView之前声明 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); ,在需要显示进度时调用 setProgressBarIndeterminateVisibility(true);即可,停止时调用 setProgressBarIndeterminateVisibility(false);

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 […]

TextUtils类-Android字符串处理类 Android开发技术

  对于字符串处理Android为我们提供了一个简单实用的TextUtils类,如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类,主要的功能如下:   是否为空字符 static boolean  isEmpty(CharSequence str)   拆分字符串  public static String[] split (String text, String expression) ,Android开发网提示大家仔细看例子如下 String.split() returns [”] when the string to be split is empty. This returns []. This does not remove any empty strings from the result. For example split("a,", "," ) returns {"a", ""}.  拆分字符串使用正则 public static String[] split […]

Android Button按钮控件美化方法 Android开发技术

  对于Android自带的Button按钮控件很多网友感觉不是很美观,如果界面上按钮不多,我们可以通过一种简单的方法实现Button脱胎换骨的外观,考虑到效率Android的layout方式的xml文件先不用了,毕竟控件不多模拟一个个性化Button还是很简单的,我们直接通过图片实现颜色的,代码如下:     private Button mBtn; //定义我们的按钮     在onCreate中加入       mBtn = (Button) findViewById(R.id.btn); //btn为layout中的Button ID       mBtn.setOnTouchListener(new OnTouchListener()        {          public boolean onTouch(View arg0,MotionEvent arg1)          {           if(arg1.getAction() == MotionEvent.ACTION_DOWN)            {            arg0.setBackgroundResource(R.drawable.pressed); //按下的图片对应pressed           }           else if(arg1.getAction() == MotionEvent.ACTION_UP)           {            arg0.setBackgroundResource(R.drawable.normal); //常态下的图片对应normal           }            else if()  […]

让你的Android程序兼容多种分辨率 Android开发技术

   随着Android机型的不断增多,从默认HVGA 320×480 到 WVGA  480×800 、FWVGA 480×854 以及QVGA的240×320,如果要保证这些机型的正常显示,可能涉及到图片资源单独设计,虽然有朋友考虑使用9patch方法可以解决拉伸,但是我们要考虑如果一个主程序的背景图片,可能原来为480×800的Nexus One上正常运行,但是到了HTC Tattoo的240×320,可以想想是什么样子。Android开发网提示大家对于Android 2.0而言资源要单独考虑,不然无法正常被加载。如下图很多都加了v6的字样。   我们将对上面的文件夹命名方式做详细的解释: drawable-hdpi 这个hdpi代表high dpi,一般为 WVGA或 FWVGA分辨率的图片,如480×800,而mdpi 代表 mid dpi,一般为HVGA,如320×480。而 ldpi为 low dpi,一般为QVGA,如240×320。而下面layout中的land代表横屏时的布局。但是有些网友可能发现了 -v6的字样android123提示这是 Android 2.0开始出现一些bug的解决方法。 -v6是专门为2.0固件的机型设计的。 v6代表 API Level 6

判断Android文件名是否安全技巧 Android开发技术

  有时候我们在处理用户输入的文件名时需要多加小心,对于Android文件名来说可以使用Java自带的正则表达式库轻松判断,Android123给出大家两种重载方式以方便不同的场合。这两个方法可以直接静态调用,传入完整路径或文件名均可。    public static boolean IsFileNameOK(String filepath) {        return Pattern.compile("[\\w%+,./=_-]+").matcher(filepath).matches();    }    public static boolean IsFileNameOK(File file) {        return Pattern.compile("[\\w%+,./=_-]+").matcher(file.getPath()).matches();    }  

Android高性能文件类MemoryFile Android开发技术

  很多网友抱怨Android处理底层I/O性能不是很理想,如果不想使用NDK则可以通过MemoryFile类实现高性能的文件读写操作。MemoryFile顾名思义就是内存文件的意思,如果你过去从事过Win32开发,那么它的原理就是MapViewOfFile(),当然开发过Linux的网友可能很快就联想到了mmap(),是的该类就是他们的托管代码层封装,位于android.os.MemoryFile这个位置,从Android 1.0开始就被支持。   MemoryFile适用于哪些地方呢?   对于I/O需要频繁操作的,主要是和外部存储相关的I/O操作,MemoryFile通过将 NAND或SD卡上的文件,分段映射到内存中进行修改处理,这样就用高速的RAM代替了ROM或SD卡,性能自然提高不少,对于Android手机而言同时还减少了电量消耗。Android123提示网友该类实现的功能不是很多,直接从Object上继承,通过JNI的方式直接在C底层执行。  主要的构造方法 MemoryFile(String name, int length) ,这里第二个参数为文件大小,需要说明的是Android的MemoryFile和传统的mmap还有一点点区别,毕竟是手机,它内部的内存管理方式ashmem会从内核中回收资源。毕竟目前部分低端机型的RAM也比较吃紧。  synchronized boolean  allowPurging(boolean allowPurging)  //允许ashmem清理内存,线程安全同步的方式。 void  close() //关闭,因为在Linux内部mmap占用一个句柄,不用时一定要释放了 InputStream  getInputStream()  返回读取的内容用Java层的InputStream保存 OutputStream  getOutputStream()  把一个OutputSream写入到MemoryFile中 boolean  isPurgingAllowed() //判断是否允许清理 int  length()  //返回内存映射文件大小 下面就是我们熟悉的,读写细节,主要是对字符数组的操作,这里大家要计算好每个文件类型的占用,同时考虑到效率对于自己分配的大小考虑粒度对齐。 int  readBytes(byte[] buffer, int srcOffset, int destOffset, int count)  void  writeBytes(byte[] buffer, int srcOffset, int destOffset, int count)     具体的实际应用,Android开发网将在下次和大家讲到。

JSONObject在Android上的应用 Android开发技术

  如果你过去开发过AJAX应用,相信对JSONObject不会陌生吧,作为基于JavaScript的数据交换格式,可以直接代替Xml,这里Android从1.0开始就完全支持JSONObject。在平时应用中直接引入import org.json.JSONObject;即可方便使用。当然同类的还有SOAP。   在常规使用方便JSONObject对象可以实现类似Bundle或Parcel可以封装数据,代替一个XML的ITEM,但最大的优势是可以执行一些简单的方法,比如说getString、has、put、getBoolean、getInt等数据类型的存取操作。Android123提示大家对于常规的项目开发,今天本文不考虑Server端的布局,在Android平台上处理这些比较简单,主要是一些http的请求处理。可以直接引入import org.apache.http.xxx来实现web server层的数据交换,如果你没有专业的Server开发技术,可以通过简单的Web配合JSON方式快速实现自己的交互式应用。  

Android的Activity你知多少呢? Android开发技术

   看到这个标题很多网友肯定回答,我知道Activity是Android上的窗口基类,了解Activity的生命周期比如onCreate onStop等,呵呵,按照这样说Android123还知道Activity的实现其实是从ApplicationContext,而ApplicationContext是从Context这个抽象类派生而来的,当然我们看到显示的是View或者ViewGroup,当然今天说的不是这些东西,而是很多网友来问的Android为什么不设计一个任务管理器,当然从Android 1.5开始ActivityManager类提供了restartPackage可以关闭一个程序,需要加上<uses-permission android:name="android.permission.RESTART_PACKAGES"/>这个权限,不过我们注意到,长按Home键可以看到以前程序的运行,同时可以快速的切换回来。这就是Android独有的程序生命周期管理机制 Activity历史栈。   我们在一个普通的程序主窗口A中打开了一个窗口B,而窗口B打开了窗口C,但是按下Back键后结果出乎了预期,是的这就是Activity的history stack的原因,在数据结构中栈是FIFO的,阻止我们不愿意看的情况的发生则可以在打开新Activity时加上标记FLAG_ACTIVITY_NO_HISTORY,代码如下:     Intent i= new Intent(this, cwj.class);       i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);   //Android开发网提示大家相关的还有Intent.FLAG_ACTIVITY_CLEAR_TOP,都试试    startActivity(i);    当然更多的程序Activity控制可以再androidmanifest.xml中定义。

Splash Screen开场屏在Android中的实现 Android开发技术

   很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后台的逻辑处理线程配合,当然对于简单的软件也可以加一个Splash Screen作为美化。在Android平台上如何实现呢?   首先创建一个Activirty,在SetContentView时直接通过ImageView创建一个全屏的图片,Android123提示大家还要考虑好分辨率和当前设备一致,onCreate添加代码如下:   new Handler().postDelayed(new Runnable(){   // 为了减少代码使用匿名Handler创建一个延时的调用            public void run() {                   Intent i = new Intent(SplashScreen.this, Main.class);    //通过Intent打开最终真正的主界面Main这个Activity                SplashScreen.this.startActivity(i);    //启动Main界面                SplashScreen.this.finish();    //关闭自己这个开场屏            }           }, 5000);   //5秒,够用了吧

不会Java或C,Android123告诉你还有选择 Android开发技术

  随着Google Android平台的逐渐开放,很多过去并不是开发Java或C的网友也想涉及,今天Android123高速你新的开发方法。今天抛开Dalvik VM的Java和NDK的C/C++,那么还有什么方法来实现自己的软件呢?     1. Flash Action Script ,对于学过Flash脚本的网友未来可以尝试通过Adobe Open Screen方法通过Flash实现界面UI,可能对于游戏开发来说是一项迈进,从Android 2.1到以后基本上都会支持Flash播放插件。   2. JavaScript+HTML+CSS,这个可能是W3C的Widget开发方式,Web程序员可以简单的通过Html+CSS实现布局,通过JavaScript实现逻辑,或者AJAX方式实现网络访问等等,软件从webkit浏览器直接加载运行。   3. Web网页游戏,现在很多浏览器都可以打网游,这归功于Adobe Flash Player强大的标示和逻辑处理能力,这样的好处显而易见就是块平台方便,用户可以在PC上娱乐,如果网速足够理想在地铁上也可以使用 Android手机浏览器来打网游,怎么样其实想想还是有很多种选择的。

GestureDetector手势识别类 – 入门篇 Android开发技术

  对于Android设备来说最主要的操作方式为触控,作为一个Android开发者来说深入了解 GestureDetector 手势识别是很有必要的,Android123今天主要介绍下该类相关的方法,以及简单的手势识别。   通常我们构造GestureDetector类时设置一个GestureDetector.OnGestureListener对象来实时监控用户的操作,OnGestureListener对象提供一些常见手势的重写方法。     @Override      public boolean onDown(MotionEvent e) {         //按下事件         return true;       }             @Override      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        //快速滚动         return true;       }             @Override      public void onLongPress(MotionEvent e) {           //长按     }             @Override      public […]

Android平台XML解析库功能不完整 Android开发技术

  很多网友可能发现Android平台上XML解析库包含了主流的Dom、SAX以及XmlPull方式,如果为了跨平台数据库保存可能不使用SQLite的话,可能XML实现最好,但是可笑的事情发生了。Android上面解析库不可以保存解析结果,这点比J2ME的KXml还简陋,真不知道Google这帮家伙如何搞的。   Android123提示大家,对于简单的XML文件创建可以使用XmlSerializer,而常规不做XML解析即Parser的话,还是使用Dom来操作每个元素,这里面我们不考虑XPath实现查找的复杂应用,但是Dom竟然无法返回整个树的字符串结果相当意外也没有transformer或输出流的相关方法,这点可以看到就不存在javax.xml.transform.的实现。目前没有很好的解决方法,如果不考虑引入第三方的完整的xml解析库jar文件。可以考虑移植一个高效轻量级的xml解析库用NDK比较有效。  

测试Android软件性能主要方法 Android开发技术

    对于Android平台上软件的性能测试可以通过以下几种方法来分析效率瓶颈,目前Google在Android软件开发过程中已经引入了多种测试工具包,比如Unit测试工程,调试类,还有模拟器的Dev Tools都可以直接反应执行性能。    1. 在模拟器上的Dev Tools可以激活屏幕显示当前的FPS,CPU使用率,可以帮助我们测试一些3D图形界面的性能。    2.  一般涉及到网络应用的程序,在效率上和网速有很多关系,这里需要多次的调试才能实际了解。    3. 对于逻辑算法的效率执行,我们使用Android上最普遍的,计算执行时间来查看:       long start = System.currentTimeMillis();      //android开发网提示这里做实际的处理do something      long duration = System.currentTimeMillis() – start;       最终duration保存着实际处理该方法需要的毫秒数。这里类似Win32上的GetTickCount,在Win 32和Symbian上都提供了高精度的性能计数器和低阶计时器,这里在Dalvik VM上的Java层这种方法对于一般的应用足以。    4. GC效率跟踪,如果你执行的应用比较简单,可以在DDMS中查看下Logcat的VM释放内存情况,大概模拟下那些地方可以缓存数据或改进算法的。    5. 线程的使用和同步,Android平台上给我们提供了丰富的多任务同步方法,但在深层上并没有过多的比如自旋锁等高级应用,不过对于Service和appWidget而言,他们实际的产品中都应该以多线程的方式处理,以释放CPU时间,对于线程和堆内存的查看这些都可以在DDMS中看到。    更多的调试和性能测试方法Android123将在以后的内容中出现。

Android全屏设置代码 Android开发技术

 如果你在开发游戏或一个主题风格很特别的应用可能需要全屏显示,在Android中全屏窗口的代码很简单,主要分为两个步骤和一个注意点:    requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏   不过Android123提醒各位开发者注意的是这些调用要放在SetContentView前面,否则无法生效或结果有出入。

Android布局Java代码构造法 Android开发技术

    一般情况下对于Android程序布局我们往往使用XML文件来编写,这样可以提高开发效率,但是考虑到代码的安全性以及执行效率,可以通过Java代码执行创建,虽然Android编译过的xml是二进制的,但是加载xml解析器的效率对于资源占用还是比较大的,一般一个简单的TextView,比如     <TextView    android:id="@+id/textControl "    android:layout_width="100px"    android:layout_height="wrap_content" />    可以等价于下面的Java代码:    LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT); //宽度为100px,高为自适应最小的高度    // setOrientation(VERTICAL); 设置布局为垂直    TextView textControl = new TextView(this);//如果从一个XXXLayout.,比如LinearLayout为View的基类时这里this应该换成为创建改类的Context   textControl.setText("Android开发网欢迎您");   addView( textControl, textParams );    当然Java处理效率比XML快得多,但是对于一个复杂界面的编写,可能需要一些套嵌考虑,如果你思维灵活的话,使用Java代码来布局你的Android应用程序是一个更好的方法。

MenuInflater Android菜单从xml创建方法 Android开发技术

   对于Android开发我们可以做的尽量MVC化,UI界面和Code逻辑代码分离方式,除了常规的Activity布局可以用xml实现外,菜单Menu也可以通过MenuInflater来映射一个布局文件,相关的创建菜单方法有些不同,如图:  @Override    protected void onCreateContextMenu(ContextMenu menu) {        MenuInflater inflater = cwj.getMenuInflater(); //这里cwj为当前的context        inflater.inflate(R.menu.android123, menu); //使用android123.xml文件作为菜单布局    }    接下来,我们创建相应的文件,路径为 /res/menu/android123.xml   具体内容如下,注意Item3可以禁用某项,同时加入相关的图片以及快捷键大家可以参考SDK实现更完整的方法。 <menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/item1_id"        android:title="@string/text1"/>    <item android:id="@+id/item2_id"        android:title="@string/text2"/>     <item android:id="@+id/item3_id"        android:title="@string/text3"       android:enabled="false" /> </menu>   本文可以帮助我们深入的定制一些界面,相关的TitleBar自定义可以参考 自定义Android标题栏TitleBar布局 

Android平台受专利影响 Android开发技术

  目前Android平台部分东西受微软专利影响,导致HTC每出一部Google手机将会付出20~40美元不等的专利费用,价格问题主要是涉及专利数量的多少决定。不过我们看到Android在开源方面有很多东西可以利用到,同时对于各个厂商的支持都比较好,比如Adobe Flash的兼容,不过我们更期待PDF Reader也应该加入进去更好些。   微软目前持有专利可能是比较稳固的,但是IBM和Apple的创新能力确实提高了不少,而Google在非IT行业的投入也是相当大的,目前来看软件巨人开始玩专利游戏了,当然大多数Linux侵犯Windows专利。   Android手机目前售价相对较高主要原因在于研发成本上,目前Motorola的设备在硬件方面成本不是很高,但是人力方面可谓是下足功夫,Moto的Blur界面看上去不像是Android,但是Motorola已经不是北美最大的手机制造商了,这一位置逐渐被iPhone代替,同时Motorola财报智能手机终端部门仍然亏损状态。

Android的ListView控件滚动时背景问题 Android开发技术

  如果大家在非黑色背景下使用ListView控件时,Android默认可能在滚动ListView时这个列表控件的背景突然变成黑色。这样可能导致程序的黑色的背景和主程序的主题既不协调。解决的方法Google在设计Android时也考虑了,在Layout的ListView中加入android:cacheColorHint="#00000000" 的属性即可。

Android开发需要自己完善的类库总结 Android开发技术

  经历了目前最新的Android 2.1包括2.2透露出的特性来看,目前Android开发在实际项目中仍然存在很多问题。这里我们主要列举下开源中有哪些主要问题:   1. xml解析,虽然Android自带了XmlPull、Dom、SAX解析器,但是对于XML修改后的保存来看仍然不够完善,当做解析器获取数据可以,如果作为数据双向交换,考虑到自己实现来看,可以考虑JSON解决或挂载Dom4j库。  2. zip处理,对于压缩文件处理,Android平台底层支持zlib库,但是可以看到底层写死仅支持utf8编码的文件名,如果文件名是日文或中文如果自己不重新编译zlib底层,还是考虑使用apache ant库提供的方法,当然对于zip密码而言仍然不被支持。   3. gif动画,目前我们可能会发现很多手机不支持Gif动画的播放,仅仅显示开头一帧,当然GIF的原理就是开一个线程轮询播放每一帧,可能考虑到平台的性能或电池功耗,在CPU没有到1.5GHz时代时可能不会被加入吧。这可能也是直到Android 2.2才加入Flash的原因。   当然还有很多底层库都存在对宽字节和编码问题,而大多数对于标准的处理仅仅兼容utf8这样的,对于unicode的兼容度不够,可能造成部分地方为乱码,比如早期Android平台对于短信无法发送中文这样的BUG。

Android上HTTP协议通讯状态获取 Android开发技术

  通常情况下轻量级的Http传输Android平台可以直接使用Sun Java的HttpURLConnection类方法处理,比如果自己定义一次请求header可以通过setRequestProperty设置,而我们需要获取的Http Web Server状态可以通过HttpURLConnection.getResponseCode() 的方法获取。   当然Http协议返回值常见的有 200 为成功,400为请求错误,404为未找到,500为服务器内部错误,403无权查看,302为重定向等等。   对于Android平台提供更完善的Apache类有HttpClient 、HttpPost、HttpResponse、HttpGet和HttpEntity,其中对于数据报头header构造通过HttpEntity,而返回状态值可以通过HttpResponse获取。   有关Android客户端和Server通讯类相关的开发我们将会在以后文章中做大量实例介绍。      

ConditionVariable Android线程同步 Android开发技术

  ConditionVariable类位于android.os.ConditionVariable,它可以帮助Android线程同步。在SDK上的介绍ConditionVariable不同于标准Java位于java.lang.Object wait() 和 notify() ,这个类可以等待自己,这就意味着 open(), close() 和 block() 可能会假死 ,如果使用ConditionVariable类的open()在调用 block() 之前, block() 将不会阻塞,相反将会返回立即。    该类一共有4个方法    boolean  block(long timeout)   阻止当前线程知道条件是open,或直到超时,这里参数long timeout为超时设置,Android123提示大家如果你们从事过Win32开发,这个方法类似DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); 函数。   void  block()   阻止当前线程知道条件 open ,是上面的无超时等待重载版本。   void  close()  重置条件为 close状态。  void  open() Open条件,释放所有线程的阻塞.   ConditionVariable在创建时还有一种构造方法是 public ConditionVariable (boolean state) ,如果为true,默认时为opened,如果为false则是closed. ,默认public ConditionVariable () 为close().

Android跨进程数据通讯-剪切板Clipboard Android开发技术

  在Android平台中每个常规的应用运行在自己的进程空间中,相对于Win32而言Android上之间的进程间传递主要有IPC、剪切板。当然今天我们说下最简单的ClipboardManager。使用剪切板可以直接实现数据的传输。整个实现比较简单,Android123提示注意剪切板中的类型判断。剪切板类位于android.text.ClipboardManager,导入时注意。   public void setClipboard(String text) {    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);    clipboard.setText(text);  }    public String getClipboard() {    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);    return clipboard.getText().toString();  }  有关剪切板的数据类型可以通过 该类的boolean  hasText() 方法判断。

在Android的Notification中显示进度条 Android开发技术

  如果你在使用Android Market下载应用可能会发现StatusBar拉下后区域除了显示常规的图标、文字和描述外还有一个进度条指示。在Android的Notification中如何加入ProgressBar呢?我们发现NotificationManager类只涉及一个提示的显示和取消,相关的细节还是在构造Notification中实现,该类的contentView属性可以帮助我们制定一个RemoteViews的布局,通过setProgressBar来实现对RemoteViews的进度指示做刷新工作,如果你做过Android上的Widget,则不会对RemoteViews陌生吧,实现图片和文字的修改可以通过setImageViewResource或setTextViewText方法实现。Android开发网需要说明的是:   RemoteViews在构造时第二个参数需要制定一个xml的布局文件。类似RemoteViews(getPackageName(),R.layout.android123);   而对于它的设置进度,4个参数中,第一个为RemoteViews中的ProcessBar ID,第二个参数为进度条的最大范围,第三个是当前的进度指示一般我们在单独的线程中处理逻辑,可以通过Handler实时回调显示状态比如setProgressBar(R.id.myProcessBar,maxProcess, currentPos, false);

Android基础概念Context的作用 Android开发技术

  很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释:    Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。   常规需要Context实例的方法主要有各种Service实现的类,比如说SensorManager在实例化时需要getSystemService(String)方法就必须由Context的实例执行,还有一些私有的文件系统I/O比如说openFileInput以及常用的Toast的makeText方法。

Android开发基础YesNo对话框构造代码 Android开发技术

  很多初入Android开发的网友询问,如何快速的实现一个简单的YesNo对话框,其实我们主要的构造代码如下   AlertDialog.Builder builder = new AlertDialog.Builder(CWJ.this);  builder.setTitle("标题");   builder.setMessage("问题描述");  builder.setPositiveButton("是", CWJ.this);  builder.setNegativeButton("否", null);  builder.setCancelable(true); //设置允许取消  builder.show(); //显示这个消息框   下面我们需要为PositiveButton设计一个Listener实现按下事件的处理。我们在Activity类名后面加入 implements DialogInterface.OnClickListener  实现Dialog的按下事件捕获。重写 onClick 方法,即可      public void onClick(DialogInterface dialog, int which) {          //dosomething     }   当然Android123还是给大家一个更简单的方法吧,无需实现DialogInterface接口,替换上面的  builder.setPositiveButton("是", CWJ.this); 这句为  builder.setPositiveButton("是", new DialogInterface.OnClickListener()                    {                       public void onClick(DialogInterface dialog, int whichButton)                       {                              //dosomething 即可                       }                   })    

100% Secure Checkout

PayPal / MasterCard / Visa